c++ - 为什么构建C++代码时编译+链接,而不是直接生成可执行文件

标签 c++ compiler-construction build

我在指导一个入门级程序员时被问到这个问题,我一直在想这个编译+链接过程是如此正式和平常以至于我从来没有想过为什么。

我能想到的一件事是提高开发效率,但是否还有其他更多与编译器相关的原因?

最佳答案

效率。 当你编译一个程序时,你为每个源文件创建了一个目标文件,如果你改变了一个源文件,你只需要重新编译那个模块然后重新链接(重新链接很便宜)。 如果编译器一次完成所有操作,则每次更改都必须重新编译所有内容。

它也符合 unix 小程序只做一件事的哲学,所以你有一个预处理器、一个编译器、一个链接器、一个库创建器。这些步骤现在可能是同一工具的不同模式。

然而,您希望编译器在一步中进行链接是有原因的,如果您允许编译器在链接时更改目标文件,则可以进行一些优化 - 大多数现代编译器都允许这样做,但它要求它们添加额外的在编译时将信息写入目标文件。

如果编译器可以将整个项目存储在一个数据库中,而不是源代码、资源、浏览信息文件、目标文件等的困惑状态,那就更好了——但开发人员非常保守!

关于c++ - 为什么构建C++代码时编译+链接,而不是直接生成可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024110/

相关文章:

C++:字符串索引和保留标点符号的问题

c++ - 为什么 sscanf 不能正常使用 bool 类型

c++ - 编译器是否删除未使用的函数、定义、变量、宏、包含等?

.net - 如何从与声明变量的 block 不同的代码块表达式中访问变量?

c++ - 用于回归测试的快速 GCC 构建

c++ - 从多个类中选择 WMI TargetInstance?

c - gcc 如何处理数组 [ 与 C 编程相关的问题 ]

Android构建系统: How to include prebuilt files from a . tar文件?

python - pip 编辑模式 "Module not found"

c++ - 使用属性 warn_unused_result [-Wunused-result] 声明的警告 : ignoring return value of 'int scanf(const char*, ...)' ,