【问题标题】:How do functions from a header file get linked to the .c file?头文件中的函数如何链接到 .c 文件?
【发布时间】:2020-10-03 01:55:06
【问题描述】:

cs50的问题集4中,有一个主函数filter.c,它使用了头文件helper.h。后者包含了几个函数的原型,这些完整的函数写在helper.c

我的问题是:既然filter.c只连接到helper.h,那么它如何连接到函数的代码?还是 filter.c 也会自动查找与链接头文件同名的 .c 文件?

我希望这有点清楚!

【问题讨论】:

  • 当最终的可执行文件构建完成后,它将在filter.ohelper.o 中“链接”。

标签: c header-files cs50


【解决方案1】:

C 程序的编译涉及以下三个基本步骤:

预处理:

预处理器获取C 源代码文件并处理#includes#defines 和其他预处理器directives。还清理所有 cmets 并展开这些文件中的所有宏。 (它对 c 和 h 文件都执行)此步骤的输出是一个 "pure" C 文件,没有预处理器指令。

编译:

编译器获取预处理器的输出并从中生成一个目标文件。用适合您的代码将在其上运行的 cpu 的程序集编写。

链接:

链接器获取编译器生成的目标文件并生成库或可执行文件。其中包含由操作系统直接运行的所有信息和进程术语(.out 或 .elf 是链接器输出的示例)。

你的情况

filter.c 或每个.c 文件(包括helper.c)中,您在#includes "helper.h" 中,此步骤以helper.h 中声明的所有函数签名结束@ 复制在filter.c 中的节奏(只有签名)。现在这发生在preprocessor time。现在在main.c 哪里(我想)你#includes "filter.h",预处理器将复制所有嵌套 .h 文件(告诉到达链中的最后一个.h 文件)到main.c(在我们的例子中,它唯一的filter.h 包含helper.h)。当compiler 来编译.c 文件时,他编译helper.c'filter.cmain.c 并生成目标文件(.o.obj - 适合当前cpu 的二进制文件)最后他触发链接器将所有这些objects 链接在一起成为完全可执行的(链接器还链接来自预定义库的所有函数,例如 printf)

                 preprocessor                    compiler                 linker
                 ------------                    --------                 --------
+------------+ copy helper.h to    +----------+         
+  helper.h  +------------------>  + filter.c + -------> filter.o +      +--------+
+------------+        |            +----------+                   |      +        +
                      |                                           |      + .elf   +
                      |                                           +--->  +        +
                      +--------->  +-----------+                         +  or    +
                                   + helper.c  + ------> helper.o ---->  + .out   +
                                   +-----------+                  +--->  +--------+
                                                                  |          ^
        +-------------+                                           |          |
        + filter.h    +---------> +-------------+                 |          |
        +-------------+           + main.c      + -----> main.o---+          | 
                                  +-------------+                            |  
                                                                             |
                                                         +-------------------+
                                                         + libs (e.g. stdio) +
                                                         +-------------------+

【讨论】:

    猜你喜欢
    • 2011-04-17
    • 2017-01-04
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多