【问题标题】:Why it's important to separate compilation and linking processes in C?为什么在 C 中分离编译和链接过程很重要?
【发布时间】:2016-07-05 09:37:23
【问题描述】:

我已经用 C 语言编程了一段时间,我想知道为什么将这些进程(编译和链接)分开很重要?

谁能解释一下?

【问题讨论】:

  • 为什么你认为它很重要?
  • 我看到很多网站和教程都是分开做这个过程的

标签: c compiler-construction linker operating-system compiler-optimization


【解决方案1】:

这对于减少重建时间很有用。如果您只更改一个源文件 - 通常不需要重新编译整个项目,而只需要重新编译一个或几个文件。

【讨论】:

    【解决方案2】:

    因为,编译负责将每个单独的源代码文件的源代码转换为相应的目标代码。而已。因此编译器不必关心您的外部符号(如库和extern 变量)。

    链接负责查找这些引用,然后生成单个二进制文件,就好像您的项目是作为单个源代码文件编写的一样。 (我也建议你参考维基百科linking页面了解静态链接和动态链接的区别)

    如果您碰巧使用了工具Make,您会发现每当您调用make 时它不会重新编译每个文件,它会查找自上次构建以来修改了哪些文件,然后仅重新编译它们。然后调用链接过程。当您处理大型项目(例如 linux 内核)时,这可以节省大量时间。

    【讨论】:

      【解决方案3】:

      现在它可能不像以前那么重要了。

      但曾经有一段时间编译一个项目可能需要几天时间 - 我们曾经在 1980 年代的一个周末进行“完整构建”。仅仅解析单个文件的源代码是一件相当大的事情,需要大量的时间和内存,因此设计语言以便它们的模块(源文件)可以单独处理。

      结果是“目标文件” - .obj (DOS/Windows/VMS) 和 .o (unix) 文件 - 其中包含可重定位代码、静态数据和导出列表(我们已经定义)和导入(我们需要的对象)。链接阶段将所有这些整合到一个可执行文件中,或归档(.lib.a.so.dll 文件等)以供进一步包含。

      使昂贵的编译任务独立运行导致了复杂的增量构建工具(如make)的出现,这显着提高了程序员的工作效率——对于大型 C 项目(如 Linux 内核)仍然至关重要。

      这也意味着任何可以编译成目标文件的语言都可以链接在一起。因此,只要稍加努力,就可以将 C 链接到 Fortran 到 COBOL 到 C++ 等等。

      从那时起开发的许多语言都突破了目标文件中存储内容的界限。 C++ 模板系统需要特殊处理,重载方法也不太适合,因为普通的.o 文件不支持同名的多个函数(请参阅C++ name mangling)。 Java 等人使用完全不同的方法,使用自定义代码文件格式和粘合到 DLL 和共享对象文件的“本机代码”调用机制。

      【讨论】:

        【解决方案4】:

        在实践中,它根本不重要。特别是对于更简单的程序,这两个步骤都是通过一个程序调用来执行的,例如

        gcc f1.c f2.c f3.c f4.c -o program
        

        从这些源文件创建可执行文件program

        但事实仍然是这些是独立的过程,在某些情况下值得注意这一点。

        【讨论】:

          【解决方案5】:

          我曾在需要两天时间编译它们的系统上工作。你不想做一个小的改变,然后必须等待 2 天才能测试。

          【讨论】:

            猜你喜欢
            • 2019-01-08
            • 1970-01-01
            • 2021-03-26
            • 2021-08-21
            • 2020-04-12
            • 2016-11-23
            • 2016-01-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多