我将使用一个纯C++编写的库(不是.NET和没有MFC)。该库可使用Visual Studio 2005 / Intel Fortran 9.1和VS 2008 / Intel Fortran 10.1编译。
显然,我将获取VS 2008的二进制文件,因为这是我电脑上的环境,但我想知道为什么直接的C++库在VS 2005和2008之间不兼容。我认为名称重整应该是相同的,但也许还有其他原因。我很久没用C++了,所以对这些事情有点生疏。
我将使用一个纯C++编写的库(不是.NET和没有MFC)。该库可使用Visual Studio 2005 / Intel Fortran 9.1和VS 2008 / Intel Fortran 10.1编译。
显然,我将获取VS 2008的二进制文件,因为这是我电脑上的环境,但我想知道为什么直接的C++库在VS 2005和2008之间不兼容。我认为名称重整应该是相同的,但也许还有其他原因。我很久没用C++了,所以对这些事情有点生疏。
它可能会起作用。使用VS 2005编译的DLL将依赖于VS 2005实现的C标准库(msvcr80.dll
),而您的代码将依赖于VS 2008的C库(msvcr90.dll
)。这意味着在运行时,将加载两个版本的C库,这是可以的,但它会增加内存使用量并略微减慢加载时间。
其他帖子中提到的,您应该能够以这种方式工作。
但是,有一个可能会成为大问题的问题 - 内存管理。特别是C++运行时可能会很棘手。
最大的问题是2005年和2008年运行时之间在内存管理方面存在一些不兼容性。只要您始终在VS2008 DLL中分配内存,并始终从DLL中删除分配的内存,一切都正常工作。这通常需要在您的DLL中制作一些“额外”的工厂和清理方法,并公开这些方法。
如果您从VS 2008 DLL中分配内存,然后从使用VS 2005编译的代码中删除它,或者反之亦然,您可能会遇到一些非常难以调试的问题。它通常可以工作,但会出现随机崩溃或不稳定性。
你可能会遇到的最大问题是CRT的使用。如果将CRT(C运行时库)静态链接到DLL中,则不应该出现任何问题。
但是,如果将CRT动态链接到项目中,则可能会遇到麻烦。Visual Studio 2005和2008使用不同版本的CRT,它们不能轻松地一起加载。但是,如果一个或两个DLL将CRT静态链接,则情况应该还不错。