方式1:#include <...>
方式2:#include "..."
<说明> #include <...> 和 #include "..." 的区别:
1. 前者一般会优先搜索 -I 选项后的头文件路径(即用gcc编译时的-I选项),之后就是标准的系统头文件路径。
2. 后者是从当前的目录来搜索
方式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 命令来查看标准系统头文件的路径。
当然,除了默认的/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 设置的路径将被优先搜索,所以在链接的时候通常都会以这种方式直接指定要链接的库的路径。
如果没有 -L 参数,只有 -l 参数,例如,-lssl、-lpthread等,即没有通过 -L 参数指定链接库的搜索路径,就会按照下面的搜索顺序去查找:
- 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
- 默认的动态库搜索路径/lib;
- 默认的动态库搜索路径/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 --list-all 命令可以列出所有支持的开发包。
pkg-config的用法:pkg -config <pkgName> --libs --cflags
pkgName:是三方库的包名。比如,pkg-config glib-2.0 --libs --cflags,使用gcc编译的时候需要使用(``)符号括起来。
例子,编译glib应用程序。