我们使用由VC6编译器构建的内部库(由其他团队开发)。这个库主要包含C风格的API。我们计划迁移到Visual Studio 9编译器。我是否应该请求使用VC9编译器构建该库?
一个更一般的问题是,使用两个不同版本的Visual Studio编译器构建的DLL在哪些方面(可能是名称损坏、优化等)有所不同?
发布于 2009-10-26 21:35:12
冲突通常发生在C运行时库中。其主要思想是在分配内存的模块中释放内存。这样就可以安全地使用由不同版本的编译器构建的库。另一个问题是结构的打包,但如果只使用Visual C++编译器,这没有什么区别。
在Visual C++中,不同版本的Name mangling有所不同,但它只适用于C++库。如果您使用C样式导出(例如,如果您有DEF文件),则没有什么可担心的。
This问题不是您的完整副本,但可能对您有所帮助。
发布于 2009-10-26 21:38:31
AFAIK,可视化的C++名称修改在各个版本之间是稳定的。
主要问题是,用一个版本编译的代码必须与该版本的CRTL链接,并且将来自多个版本的代码混合到同一DLL或EXE中将不起作用,因为这两个目标代码需要不同的RTL例程。
另一方面,如果您链接包含不同库的单独DLL,它应该可以工作。毕竟,这就是DLL的全部意义所在。
在该场景中,我建议仅使用extern "C" API(如果这是32位代码)并显式指定调用约定(__stdcall__或WINAPI或_cdecl ...)
此外,当您的应用程序有多个CRTL副本时,还有一个微妙的陷阱:您有多个堆!如果一个对象被分配到一个堆上,然后释放到另一个堆上,那么这个堆就会立即损坏,您将会崩溃。
总而言之,如果你能让它们用你的编译器重新编译,这是最简单的事情。
https://stackoverflow.com/questions/1624648
复制相似问题