什么是* .o文件?

时间:2010-02-02 17:37:28

标签: c++

我正在编译自己的项目。它因这个错误而停止了:

  

LINK ||致命错误LNK1181:无法打开   输入文件   'OBJ \赢\释放\ SRC \ LUA \ bindings.o' |

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

他们做了什么?

5 个答案:

答案 0 :(得分:76)

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

答案 1 :(得分:36)

你已经得到了一些答案,其中大多数都是正确的,但是错过(我认为)可能就是这里的重点。

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

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

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

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

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

这意味着当make(或者在你的情况下内置于IDE中的等价物)尝试构建程序时,它会查看这些行以试图找出如何构建myprogram.exe。为此,它发现它需要构建myprogram.o,因此它会查找告诉它如何构建myprogram.o的规则。这说它应该编译.cpp文件,所以就这样做。

然后事情发生了 - VC ++编译器生成myprogram.obj而不是myprogram.o作为目标文件,因此当它尝试从{{转到下一步生成myprogram.exe时1}},它发现它创建myprogram.o的尝试失败了。它按照规则所做的做了,但这并没有按照承诺产生myprogram.o。它不知道该怎么做,所以它退出并给你一个错误信息。

解决该特定问题可能非常简单:编辑make文件,使所有目标文件的扩展名为myprogram.o,而不是.obj。虽然这可能会解决所有问题,但仍有很多问题需要解决 - 这可能只是你需要的,或者它可能只会导致其他(可能更难)的问题。

答案 2 :(得分:5)

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

答案 3 :(得分:1)

请务必注意,目标文件可重定位的格式汇编为二进制代码。这是一种允许将汇编代码加载到内存中以供链接器与其他程序一起使用的表单。

引用标签的说明还没有为 .o 文件中的这些标签分配地址。

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

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

答案 4 :(得分:0)

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

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

Wikipedia可能有更详细的信息。我不确定你想要或需要多少信息。