c - 为什么在正确的文件夹 "/lib"和 "/usr/lib"中链接库(如 pthread)?

标签 c linux gcc dynamic-linking static-linking

<强>1。为什么我们需要链接非标准库/包含非标准头文件,当它们已经存在于正确的文件夹中时

anirudh@anirudh-Aspire-5920:~/Documents/DUMP$ locate libpthread
/lib/libpthread-2.12.1.so
/lib/libpthread.so.0
/usr/lib/libpthread.a
/usr/lib/libpthread.so
/usr/lib/libpthread_nonshared.a
/usr/lib/xen/libpthread.a
/usr/lib/xen/libpthread_nonshared.a
anirudh@anirudh-Aspire-5920:

ld.so/ld-linux.so - dynamic linker/loader 的手册页表示搜索了程序所需的必要库In the default path /lib, and then /usr/lib. 当我的库的 .so 文件已经存在于/lib 文件夹中时,为什么我需要专门链接它。 还有 -l选项用于链接静态库。但是当我对进程进行 pmap 时,我看到 pthread 的动态库带有 .so正在使用扩展名而不是带有 .a 的扩展名扩大。 同样

anirudh@anirudh-Aspire-5920:~/Documents/DUMP$ locate mysql.h
/usr/include/mysql/mysql.h
anirudh@anirudh-Aspire-5920:~/Documents/DUMP$

当它已经存在于文件夹中时 /usr/include这是所有头文件的标准文件夹那么为什么我需要使用 -I 专门包含它选项。

最佳答案

  1. 尽管链接器在 /lib 中搜索和 /usr/lib对于请求的库,这并不意味着它会自动加载这些库的所有。加载库是一项相当昂贵的操作,因此链接器只加载它知道需要的库。 -l是什么告诉它需要图书馆。有一些操作系统和工具链会根据 header 中的指令自动尝试找出需要哪些库(Visual C++ 在 Windows 上执行此操作),但这种技术未在 Linux 上使用。
  2. -l用于静态库和共享库。如果两者都存在,将使用共享版本,除非 -static指定给链接器。
  3. 如果你#include <mysql/mysql.h> ,预处理器将查找 /usr/include/mysql/mysql.h为了它。也就是说,搜索不是递归的 - 如果您指定 <mysql.h > 预处理器将查看 /usr/include/mysql.h不是 /usr/include/mysql/mysql.h .

关于c - 为什么在正确的文件夹 "/lib"和 "/usr/lib"中链接库(如 pthread)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5209237/

相关文章:

C - 仅使用 3 个字节将整数写入二进制文件

c - Kotlin native : C objects ownership and lifespan

c - c中的无限循环问题

linux - 缺少统计操作数

python - R_PPC_REL24 重定位超出范围

c - 在 C 中读取十六进制文件

linux - Linux 上使用 D 编程语言的 GLFW

linux - 如何直接在终端中更改屏幕单元格的颜色?

c - GCC/X86,相对跳转问题

c - 在目标文件中嵌入链接器依赖项?