【问题标题】:Why are many object files linked instead of one large object file?为什么链接多个目标文件而不是一个大目标文件?
【发布时间】:2014-08-09 11:03:08
【问题描述】:

为什么编译的编程语言(例如 C++)被设置为创建许多链接在一起的对象文件,而不是创建一个大对象

例如(用 C++ 编写,可以适用于任何编译语言),考虑项目中的两个文件 main.cppauxiliary.cpp。将main.cppauxiliary.cpp 编译为main.oauxiliary.o 然后链接到main.exemain.cpp#include auxiliary.cpp 之间有什么区别@ 仅编译为main.o 并链接到@ 987654331@?据我所知,这些至少表面上会产生相同的结果。

在多语言项目的情况下,我看到了多个对象的必要性,但并非如此。多个对象是否以某种方式为链接器在创建可执行文件时提供了更大的灵活性?

【问题讨论】:

  • 如何在包含数千个类的数十万行的单个 cpp 文件中找到任何内容?此外,当我更改 1 行时,我不想等待 1 小时来编译。
  • 使用 #include 预处理器命令,源文件对用户来说是多个文件,但对编译器显示为一个文件。
  • 编译时间会过长。

标签: c++ compiler-construction linker object-files


【解决方案1】:

像这样的独立编译单元使编译速度更快。如果您对auxilliary.cpp 进行更改,编译器只需重新​​创建auxilliary.o,而不需要重新编译所有内容。项目越大,这一点就越重要。

【讨论】:

    【解决方案2】:

    我可以用一个反问来回答这个问题:为什么要编写许多函数而不是一个大函数?

    同样的逻辑也适用于链接级别。

    【讨论】:

      【解决方案3】:

      如果您想要一个大二进制文件,您只需要构建一个静态,但这不是来自一个翻译单元的目标代码,而是来自多个翻译单元。

      现在考虑您的要求是否真的有意义:如果要创建单个 .o 文件,则必须在构建时将每个 cpp 的编译结果合并到该二进制文件中,从而有效地支付成本的链接多次。此外,对一个翻译单元的更改将要求编译器找出大目标文件中的哪些符号来自该翻译单元的原始版本,从对象中删除这些符号并在重建后添加新的符号。

      【讨论】:

        猜你喜欢
        • 2016-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        • 2019-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多