gpt4 book ai didi

c++ - 使用目标文件和源文件进行编译的区别

转载 作者:行者123 更新时间:2023-11-28 00:32:16 24 4
gpt4 key购买 nike

我有一个文件 main.cpp 包含 int main() 的实现和一个库 foofoo 之间拆分.hfoo.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 和 main.o 创建的临时对象文件编译器在第一个示例中生成的,它保留在第二个示例中,并且都保留在第三个示例中)。

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

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

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

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

关于c++ - 使用目标文件和源文件进行编译的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22437275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com