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

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

有帮助吗?

解决方案

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

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

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

其他提示

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

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

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

在这种情况下,我建议仅使用 extern“C” API和(如果这是32位代码)显式指定调用约定( __ stdcall __ WINAPI _cdecl ...)

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top