为什么编译的编程语言(例如C ++)被设置为创建链接在一起的多个目标文件,而正在创建一个大对象?< / p>
例如(用C ++编写,可以应用于任何编译语言),请考虑项目main.cpp
和auxiliary.cpp
中的两个文件。 main.cpp
和auxiliary.cpp
被编译为main.o
和auxiliary.o
然后与main.exe
相关联,main.cpp
与{#include auxiliary.cpp
之间的区别1}}仅编译为main.o
并链接到main.exe
?据我所知,这些至少表面上会产生相同的结果。
在多语言项目的情况下,我看到了多个对象的必要性,但不是这样。多个对象是否以某种方式为链接器提供了创建可执行文件的更大灵活性?
答案 0 :(得分:5)
这样的单独编译单元使编译速度更快。如果在auxilliary.cpp
中进行更改,则编译器只需重新创建auxilliary.o
而不是重新编译所有内容。对于项目规模越大,这一点变得尤为重要。
答案 1 :(得分:0)
我可以用一个修辞性的问题回答这个问题:为什么你要编写许多函数而不是一个大函数?
同样的逻辑适用于链接级别。
答案 2 :(得分:0)
如果你想要一个大二进制文件,你只需要构建一个静态库,但这不是来自一个翻译单元的目标代码,而是来自许多。
现在考虑一下你的要求是否真的有意义:如果要创建单个.o文件,它必须在构建时将每个cpp的编译结果合并到该二进制文件中,从而有效地支付成本连接多次。此外,对一个翻译单元的更改将要求编译器找出大对象文件中的哪些符号来自此翻译单元的原始版本,从对象中删除那些符号并在重建后添加新的符号。