使用Visual Studio 2008编译的C++动态链接库能否与Visual Studio 2005一起使用?

3

我将使用一个纯C++编写的库(不是.NET和没有MFC)。该库可使用Visual Studio 2005 / Intel Fortran 9.1和VS 2008 / Intel Fortran 10.1编译。

显然,我将获取VS 2008的二进制文件,因为这是我电脑上的环境,但我想知道为什么直接的C++库在VS 2005和2008之间不兼容。我认为名称重整应该是相同的,但也许还有其他原因。我很久没用C++了,所以对这些事情有点生疏。

3个回答

3

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


只有在两个CRT库之间不尝试修改CRT对象(内存,文件句柄)时,这才是可以的。例如,在80.dll中分配内存并在90.dll中操作它是可以的,但在*90.dll中释放或重新分配它则不行。调试与发布版本也类似。 - Dana Robinson

3

其他帖子中提到的,您应该能够以这种方式工作。

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

最大的问题是2005年和2008年运行时之间在内存管理方面存在一些不兼容性。只要您始终在VS2008 DLL中分配内存,并始终从DLL中删除分配的内存,一切都正常工作。这通常需要在您的DLL中制作一些“额外”的工厂和清理方法,并公开这些方法。

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


2

你可能会遇到的最大问题是CRT的使用。如果将CRT(C运行时库)静态链接到DLL中,则不应该出现任何问题。

但是,如果将CRT动态链接到项目中,则可能会遇到麻烦。Visual Studio 2005和2008使用不同版本的CRT,它们不能轻松地一起加载。但是,如果一个或两个DLL将CRT静态链接,则情况应该还不错。


谢谢。我找到了一篇文章,详细介绍了链接http://msdn.microsoft.com/en-us/library/ms235460.aspx的一些问题。我拥有的库基本上是一个文件I/O库,因此动态链接可能是一个更好的选择(取决于它的使用方式)。 - Dana Robinson
我刚刚用 dumpbin /imports 查看了它,发现该库与 CRT 动态链接。 - Dana Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接