gcc搜索路径:搜索头文件、搜索动态库

1 gcc搜索头文件和动态库的路径

1.1 本文用到的命令选项

gcc
	-x language
		显示指定后边所输入的文件所使用的的编程语言。
	-E 
		只进行预处理
	-Wp,option
		将option传递给预处理器

cpp
	预处理器程序。
	-v
		显示详细信息。

ld
	链接器程序。
	--verbose
		列出版本、支持的输入文件、用到的链接脚本等相关信息。

tr [option] set1 [set2]
	字符替换。
	-s set2替换掉set1

1.2查看预处理器搜索路径

1.2.1 C语言

echo | gcc -x c -E -Wp,-v - >/dev/null
-:从标准输入读入文件内容,而非使用参数指定待操作的文件。其他命令中-也有类似的用法,比如grepdtc
>/dev/null:不显示标准输出,只显示标准错误输出。
echo |:避免gcc因为使用了-而阻塞标准输入,会给到gcc一个EOF

结果示例:

ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

1.2.2 C++

echo | gcc -x c++ -E -Wp,-v - >/dev/null

结果示例:

ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/7"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/7
 /usr/include/x86_64-linux-gnu/c++/7
 /usr/include/c++/7/backward
 /usr/lib/gcc/x86_64-linux-gnu/7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

1.3 查看链接器搜索路径

1.3.1 方式一

ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\n

结果示例:

SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu")
SEARCH_DIR("=/lib/x86_64-linux-gnu")
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu")
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu64")
SEARCH_DIR("=/usr/local/lib64")
SEARCH_DIR("=/lib64")
SEARCH_DIR("=/usr/lib64")
SEARCH_DIR("=/usr/local/lib")
SEARCH_DIR("=/lib")
SEARCH_DIR("=/usr/lib")
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64")
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib")

1.3.2 方式二

由于gcc在调用ld的时候封装了一些选项,所以使用gcc查询搜索路径时,会与上述结果有不同的地方:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012 | tr : \\012

结果示例:

libraries

  /usr/lib/gcc/x86_64-linux-gnu/7/
/usr/x86_64-linux-gnu/lib/x86_64-linux-gnu/7/
/usr/x86_64-linux-gnu/lib/x86_64-linux-gnu/
/usr/x86_64-linux-gnu/lib/
/usr/lib/x86_64-linux-gnu/7/
/usr/lib/x86_64-linux-gnu/
/usr/lib/
/lib/x86_64-linux-gnu/7/
/lib/x86_64-linux-gnu/
/lib/
/usr/lib/x86_64-linux-gnu/7/
/usr/lib/x86_64-linux-gnu/
/usr/lib/
/usr/x86_64-linux-gnu/lib/
/usr/lib/
/lib/
/usr/lib/

1.3.3 方式三

也可以在链接的时候,通过-v选项查看库的搜索路径。如:
gcc -v foo.o bar.o -o foo

1.4 修改头文件搜索路径

1.4.1 方式一

使用下述环境变量CPATH(C或C++),C_INCLUDE_PATH(只适用于C),CPLUS_INCLUDE_PATH(只适用于C++)。如:CPATH=/home/jiliangcai/my_libs_headers gcc -c foo.c -o foo.o

1.4.2 方式二

使用gcc-I选项。如gcc -I/home/jiliangcai/my_libs_headers -c foo.c -o foo.o

1.5 修改动态库搜索路径

  1. 方式一
    使用LD_LIBRARY_PATH环境变量,如:LD_LIBRARY_PATH=/home/jiliangcai/my_libs gcc foo.o bar.o -o foo
  2. 方式二
    使用gcc-L选项。如:gcc -L/home/jiliangcai/my_libs foo.o bar.o -o foo

注1:LD_LIBRARY_PATH环境变量不会影响ld --verbosegcc -print-search-dirs命令的结果,即,通过该环境变量设置动态库的搜索路径,ld命令和gcc命令查询到的当前搜索路径,是不包含LD_LIBRARY_PATH所设置的路径的。
注2:程序在执行前,也需要使用LD_LIBRARY_PATH来指定动态库的路径。
注3:也可以参考/etc/ld.so.conf文件的使用方式来设置动态库搜索路径。

1.6 SEE ALSO

查看一个可执行文件所依赖的动态库.
gcc指定要链接的动态库.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值