我正在编译自己的项目。它因以下错误而停止:链接||致命错误LNK 1181:无法打开输入文件“obj\win\release\src\lua\bindings.o”|在win7下使用VS 2005/2008编译器使用Code::Blocks进行编译。还有许多其他空目录中缺少 *.o文件。他们是干什么的?
dsf9zpds1#
以.o结尾的文件是 * 目标文件 *。编译器为每个源文件创建一个目标文件,然后将它们链接到最终的可执行文件中。
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,但这是否能解决所有问题仍有很多疑问--这可能就是您所需要的,或者可能会导致其他(可能更困难的)问题。
myprogram.exe
myprogram.o
myprogram.cpp
myprogram.obj
.obj
.o
5m1hhzi43#
.o对象文件(在Windows上也称为.obj)包含编译的对象代码(即C或C++编译器生成的机器码),以及该文件包含的函数和其他对象的名称。对象文件由链接器处理以生成最终的可执行文件。如果生成过程未生成这些文件,则可能是makefile/项目文件有问题。
y3bcpkx14#
需要注意的是,* 目标文件 * 是以 * 可重定位 * 的格式汇编成二进制代码的。这种形式允许汇编代码通过 * 链接器 * 加载到内存中的任何位置,以便与其他程序一起使用。引用标签的指令在 .o 文件中尚未为这些标签分配地址。这些标签将被写为“0”,汇编程序为这些未知地址创建一个重定位记录。当文件被链接并输出到可执行文件时,未知地址被解析,程序可以执行。可在目标文件上使用 nm 工具列出.o文件中定义的符号。
koaltpgm5#
接受的答案是正确的。更具体地说,.o(.obj)--或 * 目标文件 * 是编译成机器码的单个源文件(* 我不确定“机器码”是否与可执行机器码相同或相似 *)。最终,它是可执行程序和纯文本源文件之间的中间体。链接器使用o文件来汇编可执行文件。Wikipedia可能有更详细的信息。我不确定您想要或需要多少信息。
5条答案
按热度按时间dsf9zpds1#
以.o结尾的文件是 * 目标文件 *。编译器为每个源文件创建一个目标文件,然后将它们链接到最终的可执行文件中。
9jyewag02#
你已经得到了一些答案,其中大部分是正确的,但错过了什么(我认为)可能是这里的重点。
我猜你有一个makefile要用来创建一个可执行文件。如果你不熟悉它们,makefile会列出文件之间的依赖关系。对于一个非常简单的情况,它可能是这样的:
第一行说明
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
,但这是否能解决所有问题仍有很多疑问--这可能就是您所需要的,或者可能会导致其他(可能更困难的)问题。5m1hhzi43#
.o对象文件(在Windows上也称为.obj)包含编译的对象代码(即C或C++编译器生成的机器码),以及该文件包含的函数和其他对象的名称。对象文件由链接器处理以生成最终的可执行文件。如果生成过程未生成这些文件,则可能是makefile/项目文件有问题。
y3bcpkx14#
需要注意的是,* 目标文件 * 是以 * 可重定位 * 的格式汇编成二进制代码的。这种形式允许汇编代码通过 * 链接器 * 加载到内存中的任何位置,以便与其他程序一起使用。
引用标签的指令在 .o 文件中尚未为这些标签分配地址。
这些标签将被写为“0”,汇编程序为这些未知地址创建一个重定位记录。当文件被链接并输出到可执行文件时,未知地址被解析,程序可以执行。
可在目标文件上使用 nm 工具列出.o文件中定义的符号。
koaltpgm5#
接受的答案是正确的。更具体地说,.o(.obj)--或 * 目标文件 * 是编译成机器码的单个源文件(* 我不确定“机器码”是否与可执行机器码相同或相似 *)。最终,它是可执行程序和纯文本源文件之间的中间体。
链接器使用o文件来汇编可执行文件。
Wikipedia可能有更详细的信息。我不确定您想要或需要多少信息。