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的手册页 – 动态链接器/加载器表示在默认路径/ lib和/usr/lib中搜索程序所需的必需库.
当我的库的.so文件已经在/ lib文件夹中时,为什么我需要专门链接它.
此外,-l选项用于链接静态库.但是当我对进程进行pmap时,我发现正在使用带扩展名为.so的pthread的动态库,而不是扩展名为.a的动态库.
同样
anirudh@anirudh-Aspire-5920:~/Documents/DUMP$locate MysqL.h
/usr/include/MysqL/MysqL.h
anirudh@anirudh-Aspire-5920:~/Documents/DUMP$
最佳答案
>虽然链接器在/ lib和/usr/lib中搜索所请求的库,但这并不意味着它会自动加载所有这些库.加载库是一项相当昂贵的操作,因此链接器只加载它知道需要的库. -l是告诉它需要库的东西.有一些操作系统和工具链会根据标题中的指令自动尝试找出需要哪些库(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.
> -l用于静态库和共享库.如果两者都存在,则将使用共享版本,除非为链接器指定了-static.
>如果#include< mysql / mysql.h>,预处理器将在/usr/include/MysqL/MysqL.h中查找.也就是说,搜索不是递归的 – 如果你指定< mysql.h>预处理器将查看/usr/include/MysqL.h,但不查看/usr/include/MysqL/MysqL.h.