【发布时间】:2021-08-10 07:10:45
【问题描述】:
当您包含标题时
#include "foo.h"
您还需要一个源文件foo.c,其中包含您在编译时传递给编译器的标头中的原型定义:gcc main.c foo.c。为什么标准库中的标头不必发生相同的情况?例如,假设您有一个main.c 文件,其中包含
#include <stdio.h>
编译时不必再写gcc main.c stdio.c,直接写gcc main.c即可。
这是为什么?当您编译并自动添加它们时,编译器/链接器是否知道在哪里查找源文件?如果不是,那么编译器如何知道函数原型如何处理?
【问题讨论】:
-
根据编译器自动链接 C 标准库(或其中的一部分)。是的,链接器通常知道标准库的存储位置。
-
"libraries" 包括带有库实现的头文件和二进制文件。您include 标头和link 库。标准 C 库会自动链接。其他库通过
-llibname链接。 -
顺便说一句:对于各种 C 标准函数,您仍然需要手动告诉链接器包含数学库
-
在 GCC 和 Clang 中添加
-nostdlib可以手动链接。但除此之外,编译器通常会为您链接标准库。 -
注意:并非所有通用链接器(或包含/自动管理链接器的通用编译器)都知道标准库的位置。头文件(包含)文件也是如此。编译器/链接器可能会使用一些“技巧”,并且他们可能知道库和头文件所在的一些标准路径。旧的 C 编译器如 TC、QC 需要设置个性化的 libraries 和 headers。在我们的时代,在大多数情况下,安装编译器会为代码编译在标准情况下成功创建必要的环境。
标签: c compilation linker header