编译的.lib文件是否可以为不同版本的Microsoft Visual C ++互换?

有些项目为C(以及可能的C ++ – 不确定)库提供了一组“Windows”二进制文件。 例如,请参阅此libxml相关页面右侧的链接。

我很确定没有办法在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库)。

所有VC ++版本甚至其他语言的MS COFF格式(.lib,.obj等)都是相同的。

问题是.obj文件依赖于其他.obj(.lib)文件。
对于C ++代码,很有可能代码无法使用新版本的VC ++标准库实现进行编译。 例如,旧版本的CRT使用extern "C++" void internal_foo(int) ,而较新的CRT使用extern "C++" void internal_foo(int, int) ,因此链接器将因“未解析的外部符号”错误而失败。 对于C代码,代码有可能编译,因为对于extern "C" ,符号名称不编码整个签名。 但是在运行时,应用程序将在调用此函数后崩溃。
如果某些数据结构的布局发生变化,链接器将无法检测到它,也会发生同样的情况。