3

我打算用一个用C++编写的C++库(不是.NET,也不用MFC)。该库可用Visual Studio 2005/Intel Fortran 9.1和VS 2008/Intel Fortran 10.1编译。使用Visual Studio 2008编译的C++ dll可以与Visual Studio 2005一起使用吗?

很明显,我要抓住VS 2008的二进制文件,因为这是我计算机上的环境,但我很好奇,是否有理由说为什么直接C++库在VS 2005和2008之间不兼容。 d假设这个名字是相同的,但也许还有其他原因。我很久没有使用过C++,所以在涉及到这些事情时我有点生疏。

回答

2

您遇到的最大问题是CRT的使用情况。如果CRT(C运行时间)静态链接到DLL中,则不应该有任何问题。

但是,如果CRT动态链接到项目中,您可能会遇到麻烦。 Visual Studio 2005和2008使用不同版本的CRT,并且它们不能轻松加载。但是,如果一个或两个DLL静态连接CRT,你应该体面得体。

+0

谢谢。我发现这篇文章详细介绍了链接http://msdn.microsoft.com/en-us/library/ms235460.aspx的一些问题。我拥有的库基本上是一个文件I/O库,因此动态链接可能是一个更好的主意(取决于它的使用方式)。 – 2009-08-02 20:47:24

+0

而我只是用dumpbin/imports来查看它,并且库是动态链接到CRT的。 – 2009-08-02 20:55:53

3

它应该可能工作。使用VS 2005编译的DLL将依赖于VS 2005的C标准库(msvcr80.dll)的实现,而您的代码将取决于VS 2008的C库(msvcr90.dll)。这意味着在运行时,C库的两个版本都会被加载,这是可以的,但它会增加您的内存使用量并减少很少的加载时间。

3

正如其他海报评论过的,您应该能够以这种方式工作。

但是,有一个问题可能是一个大问题 - 内存管理。特别是C++运行时可能会非常棘手。

最大的问题是2005年和2008年的运行时间如何管理内存之间存在一些不兼容的问题。一切工作正常,只要你总是在你的VS2008 DLL中分配你的内存,并且总是删除你的DLL内部分配的内存。这通常需要在DLL中制作一些“额外的”工厂和清理方法,然后公开这些方法。

如果您从VS 2008 DLL中分配内存,然后将其从使用VS 2005编译的代码中删除,反之亦然,您可能会遇到一些非常难以调试的问题。它通常会起作用,但随机崩溃或不稳定。

相关问题