对于不同版本的 Microsoft Visual C++,编译的 .lib 文件是不是可以互换?
Posted
技术标签:
【中文标题】对于不同版本的 Microsoft Visual C++,编译的 .lib 文件是不是可以互换?【英文标题】:Are compiled .lib files interchangeable for different versions of Microsoft Visual C++?对于不同版本的 Microsoft Visual C++,编译的 .lib 文件是否可以互换? 【发布时间】:2011-12-09 00:24:41 【问题描述】:一些项目为 C(和可能的 C++ - 不确定)库提供了一组“Windows”二进制文件。例如,查看this libxml-related page右侧的链接。
我很确定没有办法在 VC++ .lib 文件和 MinGW GCC .a 文件之间进行转换,因此称它们为“Windows”而不是“Microsoft”二进制文件似乎有点误导。但令我惊讶的是,对于不同的 VC++ 版本,显然不需要不同的二进制文件。
我似乎记得,很多年前,为跟踪器风格的音乐程序 (Jeskola Buzz) 编写插件时遇到问题,因为该程序使用的是 VC++6,而我已经升级到 VC++7。我不记得确切的问题 - 它可能部分与 DLL 有关,但我知道那些不需要关心 VC++ 版本。我认为这个问题与提供的 .lib 文件有关,也可能与它们链接到的运行时库有关。不过那是很久以前的事了,所以有点模糊。
无论如何,可以由一个版本的 MS VC++ 编译的库链接到用另一个版本构建的项目中吗?有哪些限制(如果有)?
我对从 C++ 项目调用的 C 和 C++ 库都感兴趣(我很少使用 C,除了从 C++ 调用的 C 库)。
【问题讨论】:
.lib 和 .obj 文件的二进制格式已经被固定了很长时间。典型的问题是.lib 的content。对 CRT 版本的依赖通常是一个问题,例如,不能混合静态和动态 CRT 版本。或者 C++ 模板类,那里有很多变化。 @Hans - 所以如果 .lib 使用静态 CRT,并且是纯 C 语言,那么胜算很大吗? (除了 DLL 发生的常见的 free-from-where-you-malloc 样式问题) 如果程序是用 /MT 编译的,而且它只是普通的 C,那么可能性很大。尽管对于提出问题的 SO 用户来说,这些可能性往往低得惊人。我们没有收到其他人的消息。 补充@Hans 所说的:我们有一个在 VS8 中编译的第三方静态库,一旦我们迁移到 VC9 和 10,我们就会继续使用它而没有任何问题。我想我们只是很幸运.... 另见:***.com/questions/1600399/… 【参考方案1】:MS COFF 格式(.lib、.obj 等)对于所有 VC++ 版本甚至对于其他语言都是相同的。
问题在于 .obj 文件依赖于其他 .obj (.lib) 文件。
对于 C++ 代码,很可能代码无法使用新版本的 VC++ 标准库实现进行编译。例如,旧版本的 CRT 使用 extern "C++" void internal_foo(int)
,而新版本的 CRT 使用 extern "C++" void internal_foo(int, int)
,因此链接器将失败并出现“未解析的外部符号”错误。
对于 C 代码,代码有可能编译,因为对于 extern "C"
,符号名称不会编码整个签名。但是在运行时应用程序会在调用此函数后崩溃。
如果某些数据结构的布局发生变化,链接器不会检测到它,也会发生同样的事情。
【讨论】:
所以,创建dll而不是静态库时不存在这个问题以上是关于对于不同版本的 Microsoft Visual C++,编译的 .lib 文件是不是可以互换?的主要内容,如果未能解决你的问题,请参考以下文章
Windows10系统如何安装Microsoft Visual Studio 2015及最小子数组和求解
Microsoft Visual Studio 工程属性表props/vsprops创建与使用
microsoft visual c++2015-2022无法打开密钥
如何取消选择“Microsoft Visual Studio 版本选择器”的默认版本