linux中编译C/C++指定头文件和链接库的搜索路径

2020年10月4日 | 由 陈小龙 | 1900字 | 阅读大约需要4分钟 | 归档于 linux |

一、C/C++头文件路径

方法1:#include<…>

方法2:#include”…”

方法1、2的区别:

(1)方法1一般会优先搜索 -I 选项后的头文件路径(即用gcc编译时的-I选项),之后就是标准的系统头文件路径。

(2)方法2是从当前的目录来搜索,若当前目录没有,就会出错,比较容易实现

例如:

#示例,会优先从/home/cxl/include路径去搜索#include <xxx.h>的头文件 gcc foo.c -I/home/cxl/include -o foo

方法3:在gcc命令或者Makefile文件中,使用 -I 来设置头文件的路径

方法4:设置环境变量。

(1)在当前用户目录下,设置环境变量,只针对当前用户有效。

vim .bash_profile 或者 .bashrc:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:头文件路径 //C语言

export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:头文件路径 //C++

(2)设置全局环境变量,对所有用户生效,需要root权限。

vim /etc/profile

注意:如果当前用户设置了同样的环境变量,那么将屏蔽掉相同名称的全局环境变量的作用域。

二、linux系统标准头文件的路径

一般为:/usr/include和/usr/local/include

再真正的使用过程中,可以使用cpp -v命令查看标准的头文件路径,

结果如下:

除了系统默认的include路径外,就是设置上面的 C_INCLUDE_PATH 和 CPLUS_INCLUDE_PATH 环境变量来添加标准系统头文件路径。

三、链接库文件的路径

1.系统默认的链接库文件的路径有:

/lib /usr/lib /usr/local/lib (对于64位的库,则是以lib64开头的)

2.设置链接库文件的路径

(1)在环境变量中添加。

全局设置:/etc/profile

当前用户设置:.bash_profile或者.bashrc

动态链接库搜索路径:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件路径

静态链接库搜索路径:

export LIBRARY_PATH=$LIBRARY_PATH:库文件路径

<注意> 当通过上述环境变量指定多个动态库搜索路径时,路径之间用冒号 “:” 分隔。

以上修改可以直接在Linux命令行输入(一次性),也可以在/etc/profile中完成(对所有用户生效),也可以在~/.bash_profile或者~/.bashrc中添加(针对某个用户生效),修改完成后,使用source命令使修改立即生效。

(2)在 /etc/ld.so.conf 中添加指定的链接库搜索路径(需要root权限),然后运行 /sbin/ldconfig 命令,以达到刷新 /etc/ld.so.cache 的效果。ldconfig 命令的作用就是将 /etc/ld.so.conf 指定的路径下的库文件缓存到 /etc/ld.so.cache 。因此当安装完一些库文件(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下/sbin/ldconfig 使所有的库文件都被缓存到ld.so.cache中,不然修改的内容就等于没有生效。

(3)在编译程序的链接阶段,除了上面两种设置链接库的搜索路径方式之外,还可以通过 -L 和 -l 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在链接的时候通常都会以这种方式直接指定要链接的库的路径。

例如:

#添加动态链接库搜索路径 gcc foo.c -L/home/xiaowp/lib -lfoo -o foo

#添加静态链接库搜索路径 gcc foo.c -L/home/xiaowp/lib -static -lfoo -o foo

但是如果没有-L参数,只有-I参数,例如:-lssl、-lpthread等,即没有通过 -L 参数指定链接库的搜索路径,就会按照下面的搜索顺序去查找:

<1>通过环境变量LD_LIBRARY_PATH指定动态库搜索路径

<2>配置文件/etc/ld.so.conf中指定的动态库搜索路径;

<3>默认的动态库搜索路径/lib;

<4>默认的动态库搜索路径/usr/lib。

3、链接库文件的搜索路径顺序(从上到下,依次执行)

(1) 编译目标代码时指定的动态库搜索路径,即 -L 参数后面设置的搜索路径;

(2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

(3)配置文件 /etc/ld.so.conf 中指定的动态库搜索路径;

(4)默认的动态库搜索路径/lib;

(5)默认的动态库搜索路径/usr/lib;

(6)默认的动态库搜索路径 /usr/local/lib。

4、使用pkg-config来生成三方库的链接参数

现在很多新的开发包一般都使用 pkg-config 来生成链接参数,使用 pkg-config –list-all 命令可以列出所有支持的开发包。

//查看glib库的包名

$ pkg-config –list-all|grep glib* glib-2.0 GLib - C Utility Library

pkg-config的用法:pkg -config –libs –cflags

其中pkgName是三方库的包名。使用gcc编译的时候需要使用(``)符号括起来。

例如:编译glib应用程序

方法1:

gcc -o glist_test glist_test.c -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -L/usr/local/lib -lglib-2.0

方法2:

gcc pkg-config glib-2.0 --cflags --libs glib_test.c -o glib_test