C ++-什么是* .o文件?

我正在编译自己的项目。 它因此错误而停止运行:

LINK ||致命错误LNK1181:无法打开   输入文件   'obj \ win \ release \ src \ lua \ bindings.o'|

在Win7下使用Code :: Blocks与VS 2005/2008编译器进行编译。还有很多其他空目录,其中* .o文件丢失。

他们在做什么?

Max Frai asked 2019-11-07T12:53:32Z
5个解决方案
81 votes

以.o结尾的文件是目标文件。 在将每个源文件链接到最终可执行文件之前,编译器会为每个源文件创建一个目标文件。

Joseph Salisbury answered 2019-11-07T12:53:49Z
39 votes

您已经得到了一些答案,并且大多数答案都是正确的,但是错过了(我认为)这可能是关键所在。

我的猜测是您有一个要用来创建可执行文件的makefile。 如果您不熟悉它们,makefile会列出文件之间的依赖关系。 对于一个非常简单的情况,它可能类似于:

myprogram.exe: myprogram.o
    $(CC) -o myprogram.exe myprogram.o

myprogram.o: myprogram.cpp
    $(CC) -c myprogram.cpp

第一行说.obj取决于.o。第二行说如何从myprogram.o创建myprogram.exe。第三行和第四行说myprogram.o取决于myprogram.o,以及如何分别从myprogram.cpp`创建myprogram.o

我的猜测是,就您而言,您有一个像上面的为gcc创建的makefile。 您遇到的问题是您将其用于MS VC而不是gcc。 碰巧,MS VC使用“ .obj”作为其目标文件的扩展名,而不是“ .o”。

这意味着,当make(或您所用的IDE中等效的版本)尝试构建程序时,它会查看这些行以试图找出如何构建.obj。为此,它需要构建.o, 因此,它将寻找告诉其如何构建myprogram.exe的规则。也就是说,应编译.cpp文件,然后执行此操作。

然后事情就崩溃了-VC ++编译器生成了.obj而不是.o作为目标文件,因此当它尝试进行下一步以从myprogram.o中生成myprogram.exe时,它发现创建myprogram.o的尝试完全失败了。 它确实执行了规则所说的操作,但是没有产生承诺的myprogram.o。 它不知道该怎么办,因此它退出并给您一条错误消息。

解决该特定问题的方法可能非常简单:编辑make文件,使所有目标文件的扩展名都从.obj而不是.o扩展。尽管这是否可以解决所有问题,但仍有很多疑问–这可能就是您所需要的 ,否则可能会导致其他(可能更困难)问题。

Jerry Coffin answered 2019-11-07T12:55:05Z
5 votes

.o目标文件文件(在Windows上也为.obj)包含编译的目标代码(即,由C或C ++编译器生成的机器代码),以及文件包含的函数和其他对象的名称。 链接器处理目标文件以生成最终的可执行文件。 如果您的构建过程未生成这些文件,则您的makefile / project文件可能存在问题。

answered 2019-11-07T12:55:38Z
1 votes

重要的是要注意,目标文件以可重定位的格式组装为二进制代码。 这是一种形式,它允许将汇编的代码加载到内存中的任何位置,以供链接器与其他程序一起使用。

指向标签的说明尚未在.o文件中为这些标签分配地址。

这些标签将被写为“ 0”,并且汇编程序为这些未知地址创建一个重定位记录。 当文件链接并输出到可执行文件时,未知地址将被解析,程序可以执行。

您可以在目标文件上使用nm工具列出.o文件中定义的符号。

Cyrus Vahidi answered 2019-11-07T12:56:33Z
0 votes

喷墨是正确的。 更具体地说,.o(.obj)或目标文件是编译为机器代码的单个源文件(我不确定“机器代码”是否与可执行机器代码相同或相似)。 最终,它是可执行程序和纯文本源文件之间的中介。

链接器使用o文件来汇编文件可执行文件。

维基百科可能有更详细的信息。 我不确定您想要或需要多少信息。

Frank V answered 2019-11-07T12:57:15Z
translate from https://stackoverflow.com:/questions/2186246/what-is-o-file