<强>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
专门包含它选项。
最佳答案
- 尽管链接器在
/lib
中搜索和/usr/lib
对于请求的库,这并不意味着它会自动加载这些库的所有。加载库是一项相当昂贵的操作,因此链接器只加载它知道需要的库。-l
是什么告诉它需要图书馆。有一些操作系统和工具链会根据 header 中的指令自动尝试找出需要哪些库(Visual C++ 在 Windows 上执行此操作),但这种技术未在 Linux 上使用。 -
-l
用于静态库和共享库。如果两者都存在,将使用共享版本,除非-static
指定给链接器。 - 如果你
#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/