开发中我们经常遇到自己编写或依赖第三方库文件和头文件的情况,一般处理方法如下
方法一、直接在gcc命令中通过-I指定头文件目录,-L指定库文件目录。
[root@localhost code]# gcc -Wall version1.c -o version1 -I /usr/include/mysql/ -L /usr/lib/mysql/ -lmysqlclient
方法二、通过设置环境变量更改,但重启失效。
#增加.so动态库搜索路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wm/develop/mongodb/lib
#增加.a静态库搜索路径
export LIBRARY_PATH=$LIBRARY_PATH:/home/wm/develop/mongodb/lib
#增加bin搜索路径
export PATH=$PATH:/home/wm/develop/mongodb/bin
#增加GCC的include文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include/libmonogoc-1.0/
#增加G++的include文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libmonogoc-1.0/
方法三、直接修改/etc/profile,添加环境变量。对所有用户有效修改/etc/profile,对个人有效则修改~/.bashrc
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include/libmongoc-1.0/:/usr/include/bson/:/usr/include/mysql
export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib/mysql
方法四、在/etc/ld.so.conf 文件中添加库的搜索路径(需要root权限)。将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。注意/etc/ld.so.cache。
- 静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L。
2. 再找gcc的环境变量LIBRARY_PATH。
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的。
- 动态链接时、执行时搜索路径顺序:
1. 编译目标代码时指定的动态库搜索路径。
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径。
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径。
4. 默认的动态库搜索路径/lib。
5. 默认的动态库搜索路径/usr/lib。
- LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别
LIBRARY_PATH: gcc build time environment parm. 就是gcc编译期的环境变量,指定库路径.
LD_LIBRARY_PATH: gcc runtime environment parm. gcc运行期的环境变量,.....
LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):
export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):
export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH
举个例子,我们开发一个程序,经常会需要使用某个或某些动态链接库,为了保证程序的可移植性,可以先将这些编译好的动态链接库放在自己指定的目录下,然后按照上述方式将这些目录加入到LD_LIBRARY_PATH环境变量中,这样自己的程序就可以动态链接后加载库文件运行了。
区别与使用:
开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。
发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。
- gcc的搜索路径实例
[root@localhost code]# gcc --print-search-dir
install: /usr/lib/gcc/i686-redhat-linux/4.4.7/
programs: =/usr/libexec/gcc/i686-redhat-linux/4.4.7/:/usr/libexec/gcc/i686-redhat-linux/4.4.7/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.7/:/usr/lib/gcc/i686-redhat-linux/:/usr/libexec/gcc/i686-redhat-linux/4.4.7/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.7/:/usr/lib/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../i686-redhat-linux/bin/i686-redhat-linux/4.4.7/:/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../i686-redhat-linux/bin/
libraries: =./i686-redhat-linux/4.4.7/:./:/usr/lib/mysql/i686-redhat-linux/4.4.7/:/usr/lib/mysql/:/usr/lib/gcc/i686-redhat-linux/4.4.7/:/usr/lib/gcc/i686-redhat-linux/4.4.7/:/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../i686-redhat-linux/lib/i686-redhat-linux/4.4.7/:/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../i686-redhat-linux/lib/:/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../i686-redhat-linux/4.4.7/:/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../:/lib/i686-redhat-linux/4.4.7/:/lib/:/usr/lib/i686-redhat-linux/4.4.7/:/usr/lib/
[root@localhost code]#