您需要区分标头和库。
标头声明程序可用的设施。当您包含诸如<stdio.h>
(注意:这不是— 重复不是!— 库)之类的标头时,您可以向编译器提供使用标准 I/O 库中的设施所必需的信息。通常,C 头文件不定义实现这些设施的实际代码。C++ 具有“仅标头”库(Boost 的某些部分是“仅标头”库的主要示例)。
图书馆提供设施的实施。头<stdio.h>
文件声明了一个函数fopen()
;某处有一个定义该功能的库。
一些头文件(实际上,通常是很多头文件)是特权的,它们声明的工具包含在 C 编译器链接您的程序的标准库中。您不必做任何特别的事情来将函数链接到您的程序中。其他头文件来自 C 编译器不知道先验的库,对于那些,你必须告诉它在哪里可以找到库(例如 with-L /opt/sometool/lib
作为编译器选项)和库名称(例如 with -lsometool
,它可能与/opt/sometool/lib/libsometool.so
或/opt/sometool/lib/libsometool.a
)。请注意,SomeTool 的标头可能在 中/opt/sometool/include
,您需要添加一个选项-I/opt/sometool/include
来查找sometool.h
标头。
链接器不引用标题;正确的编译器不引用库。编译器控制程序确实处理混合(它通常将编译过程的多个阶段作为单独的程序运行 - 编译器与链接器分开)。标头不包含有关库安装位置的信息。