我了解在创建 .c 和 .h 文件并将它们添加到我的项目时链接和编译是如何工作的。
但是当我将 stdio.h 之类的标题添加到我的项目时会发生什么?我知道链接器在某些标准目录中搜索 .h 文件,然后将其粘贴到其中,但标头仅包含函数原型而没有代码。编译器或链接器在哪里找到这些函数的代码,以及如何将其添加到我的源文件中?
我问的原因是因为我正在为微控制器编写引导加载程序,我想仔细查看实际发送到编译器的所有 C 代码。我正在为 PIC32 使用 XC32 编译器的非优化免费版本,所以我不相信它只包括我实际使用的内容。
您需要区分标头和库。
标头声明可供程序使用的设施。当您包含诸如<stdio.h>(注意:这不是——重复不是!——库)之类的头文件时,您就向编译器提供了使用标准 I/O 库中的设施所需的信息。通常,C 头文件不定义实现设施的实际代码。C++ 具有“仅标头”库(Boost 的某些部分是“仅标头”库的主要示例)。
图书馆提供设施的实施。的<stdio.h>报头声明的函数fopen(); 某处有一个库定义了该函数。
一些头文件(实际上,通常是很多头文件)是有特权的,它们声明的工具包含在 C 编译器链接你的程序的标准库中。您无需执行任何特殊操作即可将函数链接到您的程序中。其他头文件来自 C 编译器不知道先验的库,对于那些,您必须告诉它在哪里可以找到库(例如-L /opt/sometool/lib作为编译器选项)和库名称(例如-lsometool,可能与/opt/sometool/lib/libsometool.so或/opt/sometool/lib/libsometool.a)。请注意, SomeTool 的标题可能在 中/opt/sometool/include,您需要添加一个选项-I/opt/sometool/include来查找sometool.h标题。
链接器不引用标头;编译器本身不引用库。编译器控制程序确实处理混合(它通常作为单独的程序运行编译过程的多个阶段——编译器与链接器是分开的)。标头不包含有关库安装位置的信息。