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

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的手册页ld.so/ld-linux.so - dynamic linker/loader说,search程序所需的必要库In the default path /lib, and then /usr/lib. 当我的库的.so文件已经存在于/ lib文件夹中的时候,为什么我只需要链接它。 另外-l选项用于链接静态库。 但是当我做pmap的过程时,我看到使用.so扩展名的pthread的dynamic库正在被使用,而不是使用.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是告诉它图书馆是需要的。 有一些操作系统和工具链可以根据头文件中的指令(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