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
选项来包含它。
/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
。