【问题标题】:Difference between compiling with object and source files用目标文件和源文件编译的区别
【发布时间】:2014-03-16 13:10:04
【问题描述】:

我有一个文件main.cpp 包含int main() 的实现和一个库foo 在foo.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

【问题讨论】:

  • 第二个版本给你一个foo.o,你可以在不同的主程序中使用它,或者创建一个库,而不需要重新编译foo.cpp。

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


【解决方案1】:

编译器和链接器(以及编译器使用的其他工具)必须做的总工作是完全相同的(提供或采取一些小事情,例如删除为 foo.o 和 main.o 创建的临时目标文件编译器在第一个示例中生成,在第二个示例中保留,并且都保留在第三个示例中)。

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

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

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

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

【讨论】:

    【解决方案2】:

    如果你输入这样的内容:

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

    希望对你有帮助!

    【讨论】:

    • “小心你使用的命令的语法”是什么意思?我应该特别注意什么?
    • 别担心,这只是一个建议。我以为我在你的命令中发现了错误,但这是一场虚惊。看看这个:gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] [-pedantic] [-Idir... ] [-Ldir...] [-Dmacro[=defn]...] [-Umacro] [-foption...] [-mmachine-option...] [-o outfile] [@file] infile。 .. 这是 linux 手册中“g++”文章的一部分,其中指定了 g++ 命令的正确语法。每次在 cmd 中键入命令时,请确保您操作正确!
    • 这就是您使用包含命令的make 和Makefile 的原因,因此您(通常)需要做的就是输入make... ;)
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2016-05-28
    • 2017-01-10
    相关资源
    最近更新 更多