为什么C++ OBJ文件很重要?

19

注意:我是新手,刚学习 C++。

当我编译程序时,我发现每个类都会创建一个 .obj 文件。当我查看其他程序文件时,我发现这些程序几乎没有什么 .obj 文件,所以我想我可能做错了什么。

而且,如果我从发布目录中删除了 obj 文件,并尝试再次运行 exe,它仍然与之前完全相同,我知道这些文件不可能毫无意义,但是......

那么这些文件有什么用?是否应该为每个类文件制作它们?如果不是,我该如何解决这个问题?

在编译时,我该如何将它们放在一个名为 obj 的文件夹中?


1
这些文件是由链接器生成的,用于链接。您不需要操作它们。 - user123
1
但是如果您删除了.obj文件,那么即使您只编辑了一个.cpp文件,编译器也需要重新编译所有内容。除非您确定不需要它们,否则不要从项目目录中删除它们。 - Eric Jablow
您没有做错任何事情。如果没有 .obj 文件,您将无法进行链接,因此需要创建 .lib、.dll 或 .exe 文件。 - drescherjm
欢迎!通常我们尽量避免在问题中使用感谢标语,以保持整洁。你可以在这里阅读为什么要这样做:"Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?" - veducm
嘿,我在我的项目(Visual C++ 2015)中删除了一个类,现在它给我报错“无法打开Debug/filename.obj”,该怎么解决? - Java Man Tea Man
显示剩余2条评论
3个回答

50

.obj文件(Linux/Unix上的.o文件)是已编译的源代码文件,每个.cpp文件通常会有一个对应的.obj文件,或更正式地说,是一个“编译单元”。它们由项目构建的编译阶段产生。

这些.obj文件随后由链接器组合到一起,形成应用程序,通常在Windows上为.exe文件,或者库文件。在Windows上,库文件可以是动态库的.dll,也可以是静态库的.lib(基本上是把多个.obj文件打包到一个文件中,详见下文)。在类Unix平台上,应用程序通常没有扩展名,动态库有.so扩展名,而静态库有.a扩展名。

您在运行程序时看不到.obj文件或静态的.lib文件,因为它们在运行时不需要,只有链接器使用它们。当您运行项目的链接阶段时,链接器将所有所需的.obj文件组合成.exe.dll文件(或等效文件),这些文件在运行时使用。


9

Obj文件是编译后生成的。编译器会生成带有许多信息的OBJ文件。然后链接器使用其他文件生成可执行文件,因此这些OBJ文件不再需要。

任何C++书籍中都可以找到非常详细的答案。

没有问题。但是,如果您删除它们,您将强制编译器编译一些没有更改但不再具有OBJ文件的文件。请注意这一点。

如果您仍在编写代码,请忘记它们。


3
我刚刚写了半页的C++ "书",没有写一篇详细的答案。因此你是错误的,我不得不对你进行投票。请注意,这里的“你”指代原文作者。 - Lightness Races in Orbit
但它与其他帖子、许多网站和许多其他参考资料相似。重点是将其重定向到它们,而不是再次编写它们。 - Darkgaze
4
SO的目的不是将人们重定向到资源,而是作为人们的资源。 - The Forest And The Trees
好的。你是对的。但也许可以在SO内部重定向到类似的帖子。 - Darkgaze
1
@darkgaze:这应该使用close-as-duplicate来完成,而不是链接 ;) 不过你的回答剩下的部分都很好。 - Lightness Races in Orbit
真的吗?... U_U 我不知道我可以做到这一点...每次都有新的东西。无论如何,我想帮忙。非常感谢。 - Darkgaze

7

对象文件是通过编译代码生成的。它们将您的代码转换为机器码,以便计算机可以理解和实现您的解决方案。一旦生成了对象文件(每个.cpp文件都生成一个对象文件),编译器会使用所有相关的对象文件来构建可执行文件。可执行文件可以独立运行,而对象文件可以被删除。如果要创建另一个可执行文件,则需要再次使用相关代码的对象文件。

希望有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接