我可以在VC9项目中直接使用VC6构建的C风格库吗?

时间:2009-10-26 13:00:29

标签: c++ c vc6 visual-c++-2008

我们使用由VC6编译器构建的内部库(由其他团队开发)。该库主要包含C Style API。我们计划迁移到Visual Studio 9编译器。我应该要求使用VC9编译器构建库吗?

一个更通用的问题,使用两个不同版本的Visual Studio编译器构建的DLL在哪些方面(可能是名称修改,优化等)有所不同?

2 个答案:

答案 0 :(得分:4)

冲突通常发生在C运行时库中。主要思想是应该在分配的模块中释放内存。然后使用用不同版本的编译器构建的库是安全的。另一个问题是结构的打包,但如果只使用Visual C ++编译器则没有区别。

Name mangling因Visual C ++中的版本而异,但它仅适用于C ++库。如果您使用C样式导出(例如,如果您有DEF文件),则无需担心。

This问题不是您的完整副本,但可能会有所帮助。

答案 1 :(得分:2)

AFAIK,Visual C ++名称修改从发布到发布都很稳定。

主要问题是用一个版本编译的代码必须与该版本的CRTL链接,并且将来自多个版本的代码混合到同一个DLL或EXE中将不起作用,因为这两个对象代码都需要不同的RTL例程。

另一方面,如果你链接包含不同库的单独的DLL,它应该工作。毕竟,这就是DLL的重点。

在这种情况下,我建议仅使用extern "C" API和(如果这是32位代码)明确指定调用约定(__stdcall__WINAPI或{{1} } ...)

此外,当你的应用程序有多个CRTL副本时,有一个微妙的问题:你有多个堆!如果一个对象在一个堆上分配并释放到另一个堆,则该堆立即被破坏并且您将崩溃。

总而言之,如果你能用编译器重新编译它们,那是最简单的事情。