c++ 什么是 *.o文件?

xghobddn  于 2023-03-14  发布在  其他
关注(0)|答案(5)|浏览(405)

我正在编译自己的项目。它因以下错误而停止:
链接||致命错误LNK 1181:无法打开输入文件“obj\win\release\src\lua\bindings.o”|
在win7下使用VS 2005/2008编译器使用Code::Blocks进行编译。还有许多其他空目录中缺少 *.o文件。
他们是干什么的?

dsf9zpds

dsf9zpds1#

以.o结尾的文件是 * 目标文件 *。编译器为每个源文件创建一个目标文件,然后将它们链接到最终的可执行文件中。

9jyewag0

9jyewag02#

你已经得到了一些答案,其中大部分是正确的,但错过了什么(我认为)可能是这里的重点。
我猜你有一个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.o创建myprogram.exe *,第三和第四行分别说明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.o生成myprogram.exe时,它发现创建myprogram.o的尝试完全失败了。但这并没有像承诺的那样产生myprogram.o。它不知道该做什么,所以它退出并给予你一个错误消息。
解决这个“特定”问题的方法可能非常简单:编辑make文件,使所有对象文件的扩展名为.obj,而不是.o,但这是否能解决所有问题仍有很多疑问--这可能就是您所需要的,或者可能会导致其他(可能更困难的)问题。

5m1hhzi4

5m1hhzi43#

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

y3bcpkx1

y3bcpkx14#

需要注意的是,* 目标文件 * 是以 * 可重定位 * 的格式汇编成二进制代码的。这种形式允许汇编代码通过 * 链接器 * 加载到内存中的任何位置,以便与其他程序一起使用。
引用标签的指令在 .o 文件中尚未为这些标签分配地址。
这些标签将被写为“0”,汇编程序为这些未知地址创建一个重定位记录。当文件被链接并输出到可执行文件时,未知地址被解析,程序可以执行。
可在目标文件上使用 nm 工具列出.o文件中定义的符号。

koaltpgm

koaltpgm5#

接受的答案是正确的。更具体地说,.o(.obj)--或 * 目标文件 * 是编译成机器码的单个源文件(* 我不确定“机器码”是否与可执行机器码相同或相似 *)。最终,它是可执行程序和纯文本源文件之间的中间体。
链接器使用o文件来汇编可执行文件。
Wikipedia可能有更详细的信息。我不确定您想要或需要多少信息。

相关问题