您需要区分标题和库。
标题声明程序可用的工具。如果包含一个标头,如<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
标头。
链接器不引用标题;编译器本身不会引用库。编译器控制程序处理混合(它通常作为单独的程序运行编译过程的多个阶段 - 编译器与链接器分开)。标题不包含有关库安装位置的信息。
它在图书馆里。标准的或明确链接的(看链接器设置) –
可能的重复问题? https://stackoverflow.com/questions/3368121/how-does-acc-compiler-find-the-definitions-of-prototypes-in-header-files – user3303504