注意:我是新手,刚学习 C++。
当我编译程序时,我发现每个类都会创建一个 .obj 文件。当我查看其他程序文件时,我发现这些程序几乎没有什么 .obj 文件,所以我想我可能做错了什么。
而且,如果我从发布目录中删除了 obj 文件,并尝试再次运行 exe,它仍然与之前完全相同,我知道这些文件不可能毫无意义,但是......
那么这些文件有什么用?是否应该为每个类文件制作它们?如果不是,我该如何解决这个问题?
在编译时,我该如何将它们放在一个名为 obj 的文件夹中?
注意:我是新手,刚学习 C++。
当我编译程序时,我发现每个类都会创建一个 .obj 文件。当我查看其他程序文件时,我发现这些程序几乎没有什么 .obj 文件,所以我想我可能做错了什么。
而且,如果我从发布目录中删除了 obj 文件,并尝试再次运行 exe,它仍然与之前完全相同,我知道这些文件不可能毫无意义,但是......
那么这些文件有什么用?是否应该为每个类文件制作它们?如果不是,我该如何解决这个问题?
在编译时,我该如何将它们放在一个名为 obj 的文件夹中?
.obj
文件(Linux/Unix上的.o
文件)是已编译的源代码文件,每个.cpp
文件通常会有一个对应的.obj
文件,或更正式地说,是一个“编译单元”。它们由项目构建的编译阶段产生。
这些.obj
文件随后由链接器组合到一起,形成应用程序,通常在Windows上为.exe
文件,或者库文件。在Windows上,库文件可以是动态库的.dll
,也可以是静态库的.lib
(基本上是把多个.obj
文件打包到一个文件中,详见下文)。在类Unix平台上,应用程序通常没有扩展名,动态库有.so
扩展名,而静态库有.a
扩展名。
您在运行程序时看不到.obj
文件或静态的.lib
文件,因为它们在运行时不需要,只有链接器使用它们。当您运行项目的链接阶段时,链接器将所有所需的.obj
文件组合成.exe
和.dll
文件(或等效文件),这些文件在运行时使用。
Obj文件是编译后生成的。编译器会生成带有许多信息的OBJ文件。然后链接器使用其他文件生成可执行文件,因此这些OBJ文件不再需要。
任何C++书籍中都可以找到非常详细的答案。
没有问题。但是,如果您删除它们,您将强制编译器编译一些没有更改但不再具有OBJ文件的文件。请注意这一点。
如果您仍在编写代码,请忘记它们。
对象文件是通过编译代码生成的。它们将您的代码转换为机器码,以便计算机可以理解和实现您的解决方案。一旦生成了对象文件(每个.cpp文件都生成一个对象文件),编译器会使用所有相关的对象文件来构建可执行文件。可执行文件可以独立运行,而对象文件可以被删除。如果要创建另一个可执行文件,则需要再次使用相关代码的对象文件。
希望有所帮助!
.obj
文件,那么即使您只编辑了一个.cpp
文件,编译器也需要重新编译所有内容。除非您确定不需要它们,否则不要从项目目录中删除它们。 - Eric Jablow