Linux下编译CC项目指定头文件和链接库搜索路径
Linux下编译C/C++项目指定头文件和链接库搜索路径
头文件路径
方式1:#include <…>
方式2:#include “…”
<说明> #include <…> 和 #include “…” 的区别:
前者一般会优先搜索 -I 选项后的头文件路径(即用gcc编译时的-I选项),之后就是标准的系统头文件路径。
后者是从当前的目录来搜索
#示例,会优先从/home/xiaowp/include路径去搜索#include <xxx.h>的头文件
gcc foo.c -I/home/xiaowp/include -o foo
方式3:在gcc命令或者Makefile文件中,使用 -I 来设置头文件的路径
方式4:设置环境变量。
- 在当前用户目录下,设置环境变量,只针对当前用户有效。vim .bash_profile 或者 .bashrc:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:头文件路径 #C语言
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:头文件路径 #C++
- 设置全局环境变量,对所有用户生效,需要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 参数指定链接库的搜索路径,就会按照下面的搜索顺序去查找:
- 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
- 默认的动态库搜索路径/lib;
- 默认的动态库搜索路径/usr/lib。
链接库文件的搜索路径顺序
编译目标代码时指定的动态库搜索路径,即 -L 参数后面设置的搜索路径;
环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
配置文件 /etc/ld.so.conf 中指定的动态库搜索路径;
默认的动态库搜索路径/lib;
默认的动态库搜索路径/usr/lib;
默认的动态库搜索路径 /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
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