【问题标题】:Does the linker look for the header file链接器是否查找头文件
【发布时间】:2020-04-02 16:22:54
【问题描述】:

在编译 C 源文件时,我们会包含头文件,例如使用 #include "myheader.h"

预处理器会在编译文件之前扩展这个头文件。但是,它是如何准确找到这个头文件的呢?我相信,头文件的路径作为参数传递给使用-I 的链接器,例如gcc。

我一直认为链接器只在编译后运行。那么链接器实际上是否在运行之前运行,以查找头文件等内容,以及在编译后组合各种目标文件等?谢谢

【问题讨论】:

  • gcc 这样的前端程序的-I(大写i)选项被传递给预处理器,而不是链接器。
  • 在正常的事件过程中,在 C 中,链接器对头文件不做任何事情。它处理目标文件和库——共享的和静态的。但是,对于像gcc -o program -I/home/project/include source.c -L/home/project/lib -lproject 这样的命令行,编译使用预处理器(在source.c)、编译器本身和链接器,所有这些都在一个命令行调用中。
  • 链接器根本不关心头文件也不关心 .c 文件

标签: c gcc compilation linker c-preprocessor


【解决方案1】:

头文件主要声明元符号,以及允许编译器匹配/检查函数的交叉编译单元调用的函数原型。

链接器感兴趣的所有实际符号都在 C 文件中定义。编译器可以在代码生成期间使用预处理器符号 (#defines),但它们随后会内联到生成的代码中。

同样,对于 C++ 内联方法或模板,代码由编译器在使用它们的地方生成。

这意味着链接器不需要头文件中的任何内容,编译器已经将需要的任何内容处理到生成的代码流中(到汇编器或目标文件编译器输出)。

所以不,包含文件与链接器无关。

【讨论】:

  • 顺便说一句,链接器也不关心 .c 文件或 .cpp 文件。
【解决方案2】:

以下是从源代码到可执行文件的简化版本。

+-------------------------------+
| sources (typical .c/.h files) |
+-------------------------------+
               |
               V
         pre-processor
               |
               V
+-------------------------------+
|     intermediate sources      |
+-------------------------------+
               |
               V
           compiler
               |
               V
+-------------------------------+
|       object files (.o)       |
+-------------------------------+
               |
               V
            linker
               |
               V
+-------------------------------+
| executables/shared libraries  |
+-------------------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多