在C程序中包含头时,链接器/编译器如何找到相应的代码?

在C程序中包含头时,链接器/编译器如何找到相应的代码?,c,linker,pic32,C,Linker,Pic32,我了解在创建.c和.h文件并将其添加到项目中时链接和编译的工作原理 但是当我向我的项目中添加像stdio.h这样的标题时会发生什么呢?据我所知,链接器在一些标准目录中搜索.h文件,然后将其粘贴进去,但头文件只包含函数原型,没有代码。编译器或链接器在哪里找到这些函数的代码,以及如何将其添加到源文件中 我问这个问题的原因是因为我正在为微控制器编写一个引导加载程序,我想仔细查看所有实际发送到编译器的C代码。我正在为PIC32使用XC32编译器的非优化免费版本,因此我不相信它只包括我实际使用的内容。链接

我了解在创建.c和.h文件并将其添加到项目中时链接和编译的工作原理

但是当我向我的项目中添加像stdio.h这样的标题时会发生什么呢?据我所知,链接器在一些标准目录中搜索.h文件,然后将其粘贴进去,但头文件只包含函数原型,没有代码。编译器或链接器在哪里找到这些函数的代码,以及如何将其添加到源文件中


我问这个问题的原因是因为我正在为微控制器编写一个引导加载程序,我想仔细查看所有实际发送到编译器的C代码。我正在为PIC32使用XC32编译器的非优化免费版本,因此我不相信它只包括我实际使用的内容。

链接器根本不关心头文件。链接器甚至不知道这些文件是否存在,因为它只看到已经编译的对象文件,这就是为什么您需要明确指定要与-l链接的库的原因。。。选项链接器隐式链接标准C库-lc,这就是如何找到标准C函数的。在许多平台上,这不适用于sin或pow之类的数学函数,这就是为什么要使用这些函数时需要与-lm链接的原因


要回答指定与-l链接的库在何处的问题。。。找到:编译器有一组它在其中查找的标准目录。它也可以在工作目录中查找。您可以使用-L向库搜索路径添加更多目录。。。编译器选项。这会告诉链接器也在指定目录中查找库。

链接器根本不关心头文件。链接器甚至不知道这些文件是否存在,因为它只看到已经编译的对象文件,这就是为什么您需要明确指定要与-l链接的库的原因。。。选项链接器隐式链接标准C库-lc,这就是如何找到标准C函数的。在许多平台上,这不适用于sin或pow之类的数学函数,这就是为什么要使用这些函数时需要与-lm链接的原因


要回答指定与-l链接的库在何处的问题。。。找到:编译器有一组它在其中查找的标准目录。它也可以在工作目录中查找。您可以使用-L向库搜索路径添加更多目录。。。编译器选项。这会告诉链接器也在指定目录中查找库。

您需要区分头和库

标题声明可用于程序的设施。当您包括一个标题,如NB:this not-repeat not!-对于库,您可以向编译器提供使用标准I/O库中的工具所需的信息。一般来说,C头并不定义实现这些工具的实际代码。C++有“头文件”库,Boost的一些部分是“头文件”库的主要例子。 图书馆提供设施的实施。头部声明一个函数fopen;某个地方有一个库定义了该函数

有些头实际上,通常情况下,很多头是特权的,它们声明的功能包含在C编译器链接程序的标准库中。你不必做任何特殊的事情来将函数链接到你的程序中。其他标题来自C编译器事先不知道的库,对于这些标题,您必须告诉它在哪里可以找到库,例如使用-L/opt/sometool/lib作为编译器选项,以及库名称,例如使用-lsometool,它可能与/opt/sometool/lib/libsometool.so或/opt/sometool/libsometool.a链接。请注意,SomeTool的标题可能位于/opt/SomeTool/include中,您需要添加一个选项-I/opt/SomeTool/include来查找SomeTool.h标题


链接器不引用头;编译器本身不引用库。编译器控制程序确实处理这种混合,它通常作为单独的程序运行编译过程的多个阶段-编译器与链接器是分开的。标题不包含有关库安装位置的信息。

您需要区分标题和库

标题声明可用于程序的设施。当您包括一个标题,如NB:this not-repeat not!-对于库,您可以向编译器提供使用标准I/O库中的工具所需的信息。一般来说,C头并不定义实现这些工具的实际代码。C++有“头文件”库,Boost的一些部分是“头文件”库的主要例子。 图书馆提供设施的实施。头戴克拉 resa函数fopen;某个地方有一个库定义了该函数

有些头实际上,通常情况下,很多头是特权的,它们声明的功能包含在C编译器链接程序的标准库中。你不必做任何特殊的事情来将函数链接到你的程序中。其他标题来自C编译器事先不知道的库,对于这些标题,您必须告诉它在哪里可以找到库,例如使用-L/opt/sometool/lib作为编译器选项,以及库名称,例如使用-lsometool,它可能与/opt/sometool/lib/libsometool.so或/opt/sometool/libsometool.a链接。请注意,SomeTool的标题可能位于/opt/SomeTool/include中,您需要添加一个选项-I/opt/SomeTool/include来查找SomeTool.h标题


链接器不引用头;编译器本身不引用库。编译器控制程序确实处理这种混合,它通常作为单独的程序运行编译过程的多个阶段-编译器与链接器是分开的。标题不包含有关库安装位置的信息。

它位于库中。无论是标准的还是明确链接的,请查看链接器设置可能出现的重复问题?在图书馆里。无论是标准的还是明确链接的,请查看链接器设置可能出现的重复问题?有些编译器允许在代码中使用pragma指令,这些指令指定要链接的库的名称。这是有用的或意大利面,取决于你的看法@是的。如果我没记错的话,这个功能是在计划9中引入的。他们围绕这个想法构建了他们的整个编译器工具链,你不应该向编译器提供-L选项,因为你可以用这样的指令消除它们。有些编译器允许在代码中使用pragma指令,它指定要链接的库的名称。这是有用的或意大利面,取决于你的看法@是的。如果我没记错的话,这个功能是在计划9中引入的。他们围绕这个想法构建了他们的整个编译器工具链,你不应该向编译器提供-L选项,因为你可以用这样的指令消除它们。