使用对象文件和源文件进行编译的区别

Difference between compiling with object and source files

本文关键字:编译 区别 源文件 对象 文件      更新时间:2023-10-16

我有一个文件main.cpp,其中包含int main()的实现和一个在foo.hfoo.cpp之间划分的库foo

之间有什么区别(如果有的话(

g++ main.cpp foo.cpp -o main

g++ -c foo.cpp -o foo.o && g++ main.cpp foo.o

编辑:当然还有第三个版本:

g++ -c foo.cpp -o foo.o && g++ -c main.cpp -o main.o && g++ main.o foo.o -o main

编译器;链接器(以及编译器使用的其他工具(必须做的事情完全相同(给出或接受一些次要的事情,比如删除编译器在第一个示例中创建的为foo.o和main.o创建的临时对象文件,该文件保留在第二个示例中,两者都保留在第三个示例中(。

当您有一个更大的项目,并且使用Makefile来构建代码时,主要的区别就来了。这里的优点是,由于Makefile只重新编译需要重新编译的东西,所以不必等待编译器编译不需要重新编译。当然,假设我们选择在makefile中使用g++ -c file.cpp -o file.o变体(这是典型的方法(,而不是g++ file.cpp main.cpp ... -o main

当然,还有其他可能的场景——例如,在单元测试中,您可能希望使用相同的对象文件来构建测试,就像您用来构建主应用程序一样。同样,当项目很大并且有六个或更多的源文件时,这会产生更大的影响。

在现代机器上,编译不需要那么长时间——我的编译器项目(大约5500行C++代码(与LLVM链接,编译源文件大约需要10秒,与所有LLVM文件链接需要10秒。这是llvm库的调试版本,因此它生成了一个120MB以上的可执行文件。

一旦你进入了商业(或相应的开源类型项目(级别的软件,一个项目中涉及的源文件和其他内容的数量可能是数百个,源文件的行数通常在10万到几百万行的范围内。现在,是否只重新编译foo.cpp或"所有内容"开始变得重要,因为编译所有内容都需要一个小时的CPU时间。当然,对于多核机器,它仍然只有几分钟,但花几分钟并不理想,因为你可以只花几秒钟。

如果您键入以下内容:

g++ -o main main.cpp foo.cpp 

您同时编译和链接两个cpp文件,并生成一个名为main的可执行文件(使用-o(

如果您键入以下内容:

g++ main.cpp foo.cpp

您同时编译和链接两个cpp文件,生成一个默认名称为a.out的可执行文件。

最后,如果您键入以下内容:

g++ -c foo.cpp

您将生成一个名为foo.o的对象文件,该文件稍后可以与g++ -o executable_name file1.o ... fileN.o 链接

使用选项-c和-o可以分别执行g++编译器执行的两项任务,并分别获得相应的预处理文件和对象文件。我找到了一个链接,可以为您提供有关它的有用信息。它谈到了gcc(C编译器(,但g++和gcc的工作原理毕竟相似:

http://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html

要小心使用的命令的语法。如果您使用Linux,并且您的命令有问题,只需打开cmd窗口并键入"man name_of_the_command",即可阅读有关、语法、选项、返回值以及有关命令、系统调用、用户库函数和许多其他问题的更多相关信息。

希望它能有所帮助!