Visual c++ 为什么是C/C++';obj';仅对特定编译器有效的文件? 在尝试将C++项目链接到第三方静态库(.LIB)之后,我想我已经通过使用编译了.LIB文件的相同编译器(MVC11)来编译我的项目来解决了这个问题。p>

Visual c++ 为什么是C/C++';obj';仅对特定编译器有效的文件? 在尝试将C++项目链接到第三方静态库(.LIB)之后,我想我已经通过使用编译了.LIB文件的相同编译器(MVC11)来编译我的项目来解决了这个问题。p>,visual-c++,Visual C++,在此之前,我假设所有的.obj文件都是等效的,因此我可以使用一个.lib文件(包含各种.obj),并将其用于我将来可能要开发的任何其他项目。然而,这是一个错误的假设 所以我很好奇为什么(在MSVC的上下文中)obj文件在不同版本的编译器中有所不同。假设您的目标是x86应用程序,那么无论是否使用MSVC11/12/14编译,obj文件不应该由相同类型的指令组成吗 TLDR;为什么我不能将一个项目链接到使用不同的MSVC编译器创建的.Objix.< /P> ,那是因为它可以链接到另一个VisualC

在此之前,我假设所有的.obj文件都是等效的,因此我可以使用一个.lib文件(包含各种.obj),并将其用于我将来可能要开发的任何其他项目。然而,这是一个错误的假设

所以我很好奇为什么(在MSVC的上下文中)obj文件在不同版本的编译器中有所不同。假设您的目标是x86应用程序,那么无论是否使用MSVC11/12/14编译,obj文件不应该由相同类型的指令组成吗


TLDR;为什么我不能将一个项目链接到使用不同的MSVC编译器创建的.Objix.< /P>

,那是因为它可以链接到另一个VisualC++运行库版本,这与你使用的版本不兼容。


这个问题甚至可以用DLL来实现,如果你试图从C++中暴露C++对象。在关于ABI的长篇阅读中:)“为什么

.doc
不同于
.docx
或者甚至不同MS Office版本的
.doc
呢?”,你希望链接一个1980年制作的对象文件吗?@WeatherVane我确实链接了一个在90年代早期制作的32b
C
static
.lib
,它工作得很好。对于普通
C
而言,问题不在于ABI,而在于CRT。请参阅:和、和(以及“其他版本”)。老实说,我很难想象为什么您会认为由一个版本的编译器编译的中间文件会使用完全不同的版本。这可能是一个很好的特性,但这不是你可以假设的。