我删除了c ++程序的目标文件仍然.exe文件正在执行这是如何可能的?

时间:2013-05-10 14:54:21

标签: c++ object

我正在使用代码块IDE和GNU GCC编译器。当我创建一个简单的程序,例如add.cpp(用于添加两个数字)它通常创建两个文件add.exe(执行文件)add.o(目标文件)根据其中一些add.o在执行时链接到add.exe。 我的问题是我删除了add.o仍然add.exe正在执行,仍然产生所需的结果。如果目标文件丢失,这怎么可能?还请解释一下我的目标文件到底是什么?

6 个答案:

答案 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)

有两种类型的链接:静态和动态。编译时,编译器会生成静态链接到可执行文件中的目标文件。只有当您使用外部库并且只有动态链接它时才需要访问它。