【问题标题】:Modular programming and compiling a C program in linux在 linux 中模块化编程和编译 C 程序
【发布时间】:2016-01-16 18:18:13
【问题描述】:

所以我一直在研究这个模块化编程,主要是一次编译程序的每个文件。假设我们有 FILE.c 和 OTHER.c 两者都在同一个程序中。要编译它,我们在提示符中执行此操作

$gcc FILE.c OTHER.c -c  

使用 -c 标志将其编译成 .o 文件(FILE.o 和 OTHER.o),只有在这种情况下,我们才将其翻译(编译)为可执行文件

$gcc FILE.o OTHER.o -o 

我知道我可以这样做并跳过中间部分,但正如它随处显示的那样,他们先这样做,然后将其编译成可执行文件,我根本无法理解。

我可以知道为什么吗?

【问题讨论】:

    标签: c linux gcc modular


    【解决方案1】:

    如果您正在处理一个包含多个模块的项目,那么您不希望重新编译所有模块,只要其中一些已被修改。但是,始终需要最终的链接命令。 make 等构建工具用于跟踪哪些模块需要编译或重新编译。

    【讨论】:

      【解决方案2】:

      分两步进行可以更清楚地分离编译和链接阶段。

      • 编译步骤的输出是对象 (.o) 文件,这些文件是机器代码,但缺少每个模块的外部引用(即每个 c 文件);例如 file.c 可能使用 other.c 中定义的函数,但编译器并不关心该步骤中的依赖关系;

      • 链接步骤的输入是目标文件,其输出是可执行文件。链接步骤通过填充空白将对象文件绑定在一起(即解决对象文件之间的依赖关系)。这也是您将库添加到可执行文件的地方。

      【讨论】:

        【解决方案3】:

        另一个answer的这一部分回答你的问题:

        您可能会问为什么有单独的编译和链接步骤。 首先,以这种方式实现事情可能更容易。编译器 做它的事情,链接器做它的事情——通过保持 功能分离,降低了程序的复杂性。其他 (更明显的)优点是这允许创建大型 程序,而不必每次文件都重做编译步骤 被改变。相反,使用所谓的“条件编译”,它是 只需要编译那些已更改的源文件;为了 其余的,目标文件是链接器的足够输入。 最后,这使得实现预编译库变得简单 代码:只需创建目标文件并像其他任何文件一样链接它们 目标文件。 (事实上​​,每个文件都是单独编译的 顺便说一下,包含在其他文件中的信息称为 “单独编译模型”。)

        发表评论太长,请注明原始答案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-01
          • 1970-01-01
          • 2012-07-14
          • 2015-09-01
          • 1970-01-01
          • 2011-03-19
          • 1970-01-01
          相关资源
          最近更新 更多