我正在使用代码块IDE和GNU GCC编译器。当我创建一个简单的程序,例如add.cpp(用于添加两个数字)它通常创建两个文件add.exe(执行文件)add.o(目标文件)根据其中一些add.o在执行时链接到add.exe。 我的问题是我删除了add.o仍然add.exe正在执行,仍然产生所需的结果。如果目标文件丢失,这怎么可能?还请解释一下我的目标文件到底是什么?
答案 0 :(得分:2)
目标文件在编译时链接...然后在所有编译后目标文件是冗余的。 o文件在构建之间维护,因此您无需重建应用程序的未更改部分。
答案 1 :(得分:2)
从源代码到可执行文件(以一种非常简单的方式):
1)预处理器依次为每个.cpp收集#include'd文件,运行宏等,并为每个文件生成一个“翻译单元”。这些包含所有包含,并且已经评估了宏:它可以被识别为源代码。
2)编译器在每个翻译单元上运行,并将源转换为“目标文件”中的机器指令。这些目标文件包含它已定义的函数和变量的引用(称为“符号”),以及那些提到但从未定义的引用。
3)链接器获取所有目标文件,并匹配不同目标文件中的符号。然后它生成一个可执行文件。
您可以在没有源文件或目标文件的情况下自由运行您的可执行文件:读取这些文件是为了生成下一步。目标文件被遗忘,因为通常每次按下编译时都不需要重建所有内容:如果您只更改了一个源文件,则只需要构建一个新的目标文件和一个新的可执行文件。
答案 2 :(得分:1)
文件.o
在运行时未链接到exe
,它们在编译时链接到它(特别是在链接步骤期间)。获得可执行文件后,您可以安全地删除链接到其中的所有目标文件。删除静态链接到exe
的所有静态库也是可以的,因为它们的内容成为可执行文件的一部分。
答案 3 :(得分:1)
目标文件包含编译结果。 exe文件包含链接的结果。如果你想让exe仍在工作,你可以删除o文件
答案 4 :(得分:0)
.o
文件用于编译.exe
。其中.o
是编译对象代码,以后用于编译其他程序。
.exe
是编译文件的位置,不需要.o
。
给出编译:
g++ -c Hello.cpp -o Hello.o
g++ Hello.o main.cpp -o mainprogram.exe
第一行创建.o
文件,但不进行外部链接。第二行使用此.o
和.cpp
文件并将您的程序链接在一起。
程序运行所需的唯一文件不在.exe
.so
个.a
文件或{{1}},分别是共享库和静态库。
对于目标文件,这可能有助于http://en.wikipedia.org/wiki/Object_file
答案 5 :(得分:0)
有两种类型的链接:静态和动态。编译时,编译器会生成静态链接到可执行文件中的目标文件。只有当您使用外部库并且只有动态链接它时才需要访问它。