使用Visual Studio 2008编译的C ++ DLL是否可以与Visual Studio 2005一起使用?

时间:2009-08-02 19:59:54

标签: c++ windows visual-studio visual-studio-2008 visual-studio-2005

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

显然我要抓取VS 2008的二进制文件,因为那是我计算机上的环境,但我很好奇是否有原因导致直接的C ++库在VS 2005和2008之间不兼容。我会假设名称修改是相同的,但可能还有其他原因。我很长一段时间没有使用C ++,所以当涉及到这些东西时,我有点生疏。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

正如其他海报所评论的那样,你应该能够以这种方式工作。

但是,有一个问题可能很重要 - 内存管理。特别是C ++运行时可能很棘手。

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

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

答案 2 :(得分:2)

您将遇到的最大问题是使用CRT。如果CRT(C RunTime)静态链接到DLL,则不应该有任何问题。

但是,如果CRT动态链接到项目中,您可能会遇到麻烦。 Visual Studio 2005和2008使用不同版本的CRT,并且无法轻松加载togeter。但是,如果DLL中的一个或两个静态链接CRT,那么你应该处于不错的状态。