gcc 7.5.0
不会有人没遇到过
collect2.exe: error: ld returned 1 exit status
吧,对于我这样的 C++ 新手,安装第三方库都不知道头文件和库文件被安装在哪儿了,自然也不明白怎么去用,经常遇到“不知道包含哪些头文件”,“如何指定链接方式”, “为什么链接错误”等问题,然后一天就在抓耳挠腮的中过去了。
头文件的查找顺序
先搜索当前目录(此时一般都是引用自己写的 .h 文件,用双引号包含
#include “tools.h”
);
搜索
-I
选项指定的目录(
gcc ... -Ixxx
);
搜索环境变量
C_INCLUDE_PATH
,
CPLUS_INCLUDE_PATH
和
CPATH
指定的目录(
不建议使用
,参考
详解Linux下环境变量C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、CPATH以及常见错误
);
搜索编译器内定的目录,可以通过
cpp -v
查看(也是源码安装的第三方库默认的安装路径)。
库的查找顺序
因为有静态库和动态库之分,所以库的查找顺序分为“编译时库的查找顺序”和“运行时库的查找顺序”。
编译时库的查找顺序
-L
或
-Wl,-rpath
指定的路径;
环境变量
LD_LIBRARY_PATH
里指定的路径;
查找
/etc/ld.so.conf
文件指定的路径(其默认路径我一般简记为
/lib
,
/usr/lib
,
usr/local/lib
以及这些路径下跟机器架构相关的路径);
运行时动态库查找路径
动态库这玩意儿出现后,不仅要在编译时指定库的搜索路径,还要在运行时指定。
编译时
-Wl,-rpath
指定的路径;
环境变量
LD_LIBRARY_PATH
里指定的路径;
查找
/etc/ld.so.conf
文件指定的路径;
没错,最可恨的是
-L
指定的路径不在其中!
关于如何使用这几种方式的使用可以参考
C/C++构建静态库和动态库
。