目录

Linux下编译CC项目指定头文件和链接库搜索路径

Linux下编译C/C++项目指定头文件和链接库搜索路径

头文件路径

方式1:#include <…>

方式2:#include “…”

<说明> #include <…> 和 #include “…” 的区别:

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

  2. 后者是从当前的目录来搜索

#示例,会优先从/home/xiaowp/include路径去搜索#include <xxx.h>的头文件
gcc foo.c -I/home/xiaowp/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++

  1. 设置全局环境变量,对所有用户生效,需要root权限。vim /etc/profile

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

Linux系统标准头文件路径

/usr/include

/usr/local/include

可以使用 cpp -v 命令来查看标准系统头文件的路径。

# cpp -v
Using built-in specs.
COLLECT_GCC=cpp
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/cc1 -E -quiet -v - -mtune=generic -march=x86-64
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include
 /usr/local/include
 /usr/include
End of search list.

当然,除了默认的/usr/include, /usr/local/include等include路径外,还可以通过设置环境变量来添加系统include的路径,就是设置上面的 C_INCLUDE_PATH 和 CPLUS_INCLUDE_PATH 环境变量来添加标准系统头文件路径。

链接库文件路径

  • 系统默认的链接库路径有:

/lib

/usr/lib

/usr/local/lib

对于64位的库,则是以lib64开头的。

设置链接库文件的搜索路径

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命令使修改立即生效,例如: source ~/.bash_profile。

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 参数,只有 -l 参数,例如,-lssl、-lpthread等,即没有通过 -L 参数指定链接库的搜索路径,就会按照下面的搜索顺序去查找:

  1. 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径
  2. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
  3. 默认的动态库搜索路径/lib;
  4. 默认的动态库搜索路径/usr/lib。

链接库文件的搜索路径顺序

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

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

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

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

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

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

使用  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:是三方库的包名。比如,pkg-config glib-2.0 –libs –cflags,使用gcc编译的时候需要使用(``)符号括起来。

例子,编译glib应用程序。

# 编译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,使用 pkg-config 方式
gcc `pkg-config glib-2.0 --cflags --libs` glib_test.c -o glib_test