目录
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
-
:从标准输入读入文件内容,而非使用参数指定待操作的文件。其他命令中-也有类似的用法,比如grep
、dtc
。
>/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 修改动态库搜索路径
- 方式一
使用LD_LIBRARY_PATH
环境变量,如:LD_LIBRARY_PATH=/home/jiliangcai/my_libs gcc foo.o bar.o -o foo
- 方式二
使用gcc
的-L
选项。如:gcc -L/home/jiliangcai/my_libs foo.o bar.o -o foo
注1:LD_LIBRARY_PATH
环境变量不会影响ld --verbose
和gcc -print-search-dirs
命令的结果,即,通过该环境变量设置动态库的搜索路径,ld
命令和gcc
命令查询到的当前搜索路径,是不包含LD_LIBRARY_PATH
所设置的路径的。
注2:程序在执行前,也需要使用LD_LIBRARY_PATH
来指定动态库的路径。
注3:也可以参考/etc/ld.so.conf
文件的使用方式来设置动态库搜索路径。