一.背景
我们在开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助许多函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(so、或lib、dll)的集合。
虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下;Windows所使用的库文件主要放在Visual Stido的目录下的include和lib,以及系统文件夹下。但也有的时候,我们要用的库不再这些目录下,所以GCC在编译时必须用自己的办法来查找所需要的头文件和库文件。
二.库文件的查找及使用方法
举个例子:
我们的程序test.c是在linux上使用c连接mysql,这个时候我们需要去mysql官网下载MySQL Connectors的C库,下载下来解压之后,有一个include文件夹,里面包含mysql connectors的头文件,还有一个lib文件夹,里面包含二进制so文件libmysqlclient.so其中inclulde文件夹的路径是/usr/dev/mysql/include,lib文件夹是/usr/dev/mysql/lib
2.1编译成可执行文件
首先我们要进行编译test.c为目标文件,需要包含其头文件,这个时候需要执行
gcc -c -I /usr/dev/mysql/include test.c -o test.o
2.2链接
最后我们把所有目标文件链接成可执行文件,需要添加lib文件的路径:
gcc -L /usr/dev/mysql/lib -lmysqlclient test.o -o test
Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),二者的区别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
当然上述两步动作其实是可以合成一步的,这里为了说明问题,才分两步走。
2.3其他知识点补充
默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。
比如,在/usr/dev/mysql/lib目录下有链接时所需要的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令:
gcc -L /usr/dev/mysql/lib -static -lmysqlclien test.o -o test
三.编译器一般对库的默认搜索路径
3.1静态库链接时搜索路径顺序
1. ld会去找GCC命令中的参数-L;
2. 再找gcc的环境变量LIBRARY_PATH;
3. 再找内定目录 /lib /usr/lib /usr/local/lib ;
3.2动态链接时,执行的搜索路径
1. 编译目标代码时指定的动态库搜索路径;
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4. 默认的动态库搜索路径/lib;
5. 默认的动态库搜索路径/usr/lib;
有关环境变量
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径