gcc中使用 -I 和 -L 引入外部头文件和库文件时路径的搜索次序

gcc中使用 -I 和 -L 引入外部头文件和库文件时路径的搜索次序

 

摘自《An Introduction to GCC》


默认情况下,gcc在下面目录中搜索头文件:
/usr/local/include/
/usr/include/
在下面目录中搜索库:
/usr/local/lib/
/usr/lib/
搜索头文件的目录列表常被称为include路径,而搜索库的目录列表被称为搜索路径或链接路径。
在这些路径中的目录是按次序搜索的,在上面的两个列表中从第一个到最后一个。例如,“/usr/local/include”中找到的头文件优先于“/usr/include”中的同名文件。类似的,“/usr/local/lib”

中找到的库优先于“/usr/lib”中的同名库。
当有其他库被安装到另外的目录中,为了能按序找到这些库,需要扩展搜索路径。编译器选项“-I”和“-L”用于把新目录添加到各自的include路径和库搜索路径的头上。

通过shell中的环境可以控制头文件和库的搜索路径。可以在每次开始shell会话的相应登录文件中,比如“.bash_profile”,自动地设置它们。
可以使用环境变量C_INCLUDE_PATH(针对C的头文件)或CPP_INCLUDE_PATH(针对C++的头文件)把其他目录添加到include路径中。
例如,当编译C程序时,下面的命令会把“/opt/gdbm-1.8.3/include”添加到include路径中:
$ C_INCLUDE_PATH=/opt/gdbm-1.8.3/include
$ export C_INCLUDE_PATH
该目录将在命令行上用选项“-I”指定的任何目录之后,但在标准默认目录“/usr/local/include”和“/usr/include”之前被搜索。
Shell命令export是必要的,以便shell以外的程序也能获得该环境变量,比如象编译器----对每一次shell会话的每一个变量来说,只需要设一次,也可以在相应的登录文件中设置。
类似的,使用环境变量LIBRARY_PATH可以把另外的目录添加到链接路径中去。例如,下面的命令会把“/opt/gdbm-1.8.3/lib”添加到链接路径中:
$ LIBRARY_PATH=/opt/gdbm-1.8.3/lib
$ export LIBRARY_PATH
该目录将在命令行上用选项“-L”指定的任何目录之后,但在标准默认目录“/usr/local/lib”和“/usr/lib”之前被搜索。
环境变量被设置好以后,程序可以不用带“-I”和“-L”选项就能成功被编译,
$ gcc -Wall dbmain.c -lgdbm
因为现在默认路径包括了在环境变量C_INCLUDE_PATH和LIBRARY_PATH中指定的目录。

遵循标准Unix搜索路径的规范,搜索目录可以在环境变量中用冒号分隔的列表形式一起指定:
DIR1:DIR2:DIR3:...
这些目录被依次从左到右搜索。单个点“.”可以用来指示当前目录。7
例如,下面的设置把安装软件包的当前目录,及在“/optgdbm-1.8.3”和“/net”目录下各自的“include”,“lib”目录放到默认的include和链接路径中去:
$ C_INCLUDE_PATH=.:/opt/gdbm-1.8.3/include:/net/include
$ LIBRARY_PATH=.:/opt/gdbm-1.8.3/lib:/net/lib
在命令行上可以重复使用“-I”和“-L”选项来指定多个搜索路径的目录。例如,下面的命令,
$ gcc -I. -I/opt/gdbm-1.8.3/include -I/net/include -L. -L/opt/gdbm-1.8.3/lib -L/net/lib .....
等同于上面在环境变量中设置的。
当环境变量和命令行选项被同时使用时,编译器按下面的次序搜索目录:
1. 从左到右搜索由命令行“-I”和“-L”指定的目录
2. 由环境变量,比如C_INCLUDE_PATH和LIBRARY_PATH指定的目录
3. 默认的系统目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值