linux找不到动态链接库的解决方案
有时候系统中明明存在某个动态链接库,但是编译运行程序的时候就是发现找不到,而且怎么设置也不起作用,可以试试下面这个终极解决方案。。。。
解决方案:将动态链接库所在的目录添加到 /etc/ld.so.conf 末尾。,执行以下命令 sudo /sbin/ldconfig 使得修改生效。
这里总结一下相关知识:
1.头文件搜索路径先后排序:
- 当前路径;
- 编译时指定的路径,比如--prefix=/usr/local,查找的时候会去/usr/local/include/目录找.h文件;
- gcc的specs文件里(参考:GCC 编译配置文件 specs);
- 使用-I参数指定的目录(优先级最高);
- gcc的环境变量设置 CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH ;
- 系统标准的include目录。
GCC looks in several different places for headers. On a normal Unix system, if you do not instruct it otherwise, it will look for headers requested with #include <file> in: /usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include For C++ programs, it will also look in libdir/../include/c++/version, first. In the above, target is the canonical name of the system GCC was configured to compile code for; often but not always the same as the canonical name of the system it runs on. version is the version of GCC in use.
2.动态库的搜索路径先后顺序:
- 编译目标代码时指定的动态库搜索路径;
- 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
- 默认的动态库搜索路径/lib;
- 默认的动态库搜索路径/usr/lib。
3.通过修改系统环境变量设置搜索路径:
- 使用 gcc 编译时将
头文件
路径添加到 C_INCLUDE_PATH 系统环境变量中; - 使用 g++ 编译时将
头文件
路径添加到 CPLUS_INCLUDE_PATH 系统环境变量中; - 将
动态连接库
路径添加到 LD_LIBRARY_PATH 系统环境变量中; - 将
静态库
路径添加到 LIBRARY_PATH 系统变量中。
4.通过添加编译选项设置搜索路径:
- -I 头文件所在的路径
- -L 库文件所在的路径(包括静态库和动态库)
- -l 指定库文件