首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在VC9项目中直接使用用VC6构建的C样式库吗?

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

Stack Overflow用户
提问于 2009-10-26 21:00:29
回答 2查看 505关注 0票数 3

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-26 21:35:12

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

在Visual C++中,不同版本的Name mangling有所不同,但它只适用于C++库。如果您使用C样式导出(例如,如果您有DEF文件),则没有什么可担心的。

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

票数 4
EN

Stack Overflow用户

发布于 2009-10-26 21:38:31

AFAIK,可视化的C++名称修改在各个版本之间是稳定的。

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

另一方面,如果您链接包含不同库的单独DLL,它应该可以工作。毕竟,这就是DLL的全部意义所在。

在该场景中,我建议仅使用extern "C" API(如果这是32位代码)并显式指定调用约定(__stdcall__WINAPI_cdecl ...)

此外,当您的应用程序有多个CRTL副本时,还有一个微妙的陷阱:您有多个堆!如果一个对象被分配到一个堆上,然后释放到另一个堆上,那么这个堆就会立即损坏,您将会崩溃。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1624648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档