我们使用使用 VC6 编译器构建的内部库(由其他团队开发)。该库主要包含 C 风格的 API。我们计划迁移到 Visual Studio 9 编译器。我应该请求使用 VC9 编译器构建库吗?
一个更通用的问题,使用两个不同版本的 Visual Studio 编译器构建的 DLL 在哪些方面(可能是名称修改、优化等)有所不同?
我们使用使用 VC6 编译器构建的内部库(由其他团队开发)。该库主要包含 C 风格的 API。我们计划迁移到 Visual Studio 9 编译器。我应该请求使用 VC9 编译器构建库吗?
一个更通用的问题,使用两个不同版本的 Visual Studio 编译器构建的 DLL 在哪些方面(可能是名称修改、优化等)有所不同?
AFAIK,Visual C++ 名称修改从一个版本到另一个版本都是稳定的。
主要问题是使用一个版本编译的代码必须与该版本的 CRTL 链接,并且将来自多个版本的代码混合到同一个 DLL 或 EXE 中是行不通的,因为这样两个目标代码都需要不同的 RTL 例程。
另一方面,如果您链接包含不同库的单独 DLL,它应该可以工作。毕竟,这就是 DLL 的全部意义所在。
在这种情况下,我建议仅使用extern "C"
API 并(如果这是 32 位代码)明确指定调用约定(__stdcall__
或WINAPI
或_cdecl
...)
此外,当您的应用程序有多个 CRTL 副本时,还有一个微妙的问题:您有多个堆!如果一个对象被分配在一个堆上并释放到另一个堆上,那么这个堆就会立即损坏,你会崩溃。
总而言之,如果你能让它们用你的编译器重新编译,那是最简单的事情。