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

时间:2014-03-16 13:10:04

标签: c++ compiler-construction hyperlink g++

我的文件main.cpp包含int main()的实施,以及foofoo.h之间的库foo.cpp

之间有什么区别(如果有的话)
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

2 个答案:

答案 0 :(得分:2)

编译器和编译器的总工作量。链接器(和编译器使用的其他工具)必须完全相同(给出或采取一些小的东西,比如删除为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秒来编译源文件,另外10秒钟需要链接所有LLVM文件。这是llvm库的调试版本,因此它可以生成120多MB的可执行文件。

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

答案 1 :(得分:1)

如果您输入以下内容:

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”,以便阅读有关命令,系统调用,用户库函数的有关命令,语法,选项,返回值和一些更相关的信息。还有很多其他问题。

希望它有所帮助!