c - 为什么有些系统库需要 -l 选项而其他系统库不需要?
问题描述
我最近参加了一个使用 pthreads 的课程,在编译时我们被告知要添加-lpthread
. 但是怎么在使用#include <>
系统头文件的其他语句时,对象实现代码的链接似乎是自动发生的呢?例如,如果我只想获取头文件#include <stdio.h>
,我不需要-l
编译中的选项,该.o
实现文件文件的链接就发生了。
解决方案
编译器隐式链接标准 C 库 libc.a,因此-lc
不需要参数。Pthreads 是一个系统库,但不是 C 标准库的一部分,因此必须显式链接。
如果要指定-nolibc
,则需要显式链接 libc (或一些替代 C 库)。
如果所有系统库都被隐式链接,gcc 必须对每个系统有不同的实现(例如 pthreads 不是 Windows 上的系统库),如果系统引入了新库,gcc 必须在锁定步骤中更改. 此外,链接时间会随着以某种未知顺序搜索每个库以解析符号而增加。C 标准库是编译器在任何特定实现中都可以依赖的一个库,因此隐式链接通常是安全且简单方便的。
推荐阅读
- python - 如何在 keras 中产生单热输出?
- android - 房间数据库迁移没有正确处理转换
- axios - aws-amplify 与 Nativescript 的集成(角度)
- azure-devops - VSTS“Visual Studio 测试”任务在发布后删除 TRX 文件
- python - 如何保留字符串中的 '\n 字符?
- javascript - 选择框时如何重新加载页面
- php - wordpress 获取所有标题菜单项的列表
- c - 将变量分配给链表中的下一项
- c++ - 如何在 C++ 中为模板类包含非成员运算符重载?
- html - 小于父级时居中表格,否则滚动 - 没有固定宽度