首页 > 解决方案 > 为什么有些系统库需要 -l 选项而其他系统库不需要?

问题描述

我最近参加了一个使用 pthreads 的课程,在编译时我们被告知要添加-lpthread. 但是怎么在使用#include <>系统头文件的其他语句时,对象实现代码的链接似乎是自动发生的呢?例如,如果我只想获取头文件#include <stdio.h>,我不需要-l编译中的选项,该.o实现文件文件的链接就发生了。

标签: ccompilation

解决方案


编译器隐式链接标准 C 库 libc.a,因此-lc不需要参数。Pthreads 是一个系统库,但不是 C 标准库的一部分,因此必须显式链接。

如果要指定-nolibc,则需要显式链接 libc (或一些替代 C 库)。

如果所有系统库都被隐式链接,gcc 必须对每个系统有不同的实现(例如 pthreads 不是 Windows 上的系统库),如果系统引入了新库,gcc 必须在锁定步骤中更改. 此外,链接时间会随着以某种未知顺序搜索每个库以解析符号而增加。C 标准库是编译器在任何特定实现中都可以依赖的一个库,因此隐式链接通常是安全且简单方便的。


推荐阅读