为什么用 tar.gz 安装的共享库 gcc 找不到?
情况
项目是由 CMake 构建的动态库,用 CPack 我们打包得到了一个 deb 包版本和一个 tar.gz 的压缩包版本。前者安装之后 demo 能够正常编译运行,但是在换用压缩包安装共享库后编译 demo 则出现了找不到库的错误(这里讨论的是非标准路径的情况,即安装路径不在 /
、/usr
和 /usr/local
下)。
测试 demo 是用 Makefile 写的,设置了 INCLUDE
环境变量为要包含的头文件路径,并且新增了 /etc/ld.so.conf.d/xxx.conf 和重做了 ldconfig
的 cache。但是 gcc 还是无法识别这个库。
Tip
这是因为 ldconfig
只是管理一个库在运行时可以去哪些路径搜索,静态链接的时候链接器不会去看这个配置。INCLUDE
环境变量可能是我记错了,我现在没有找到什么工具是认识这个环境变量的。CMake 认识的环境变量可以参考链接 https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html 。Make 也认识一些环境变量,但是 INCLUDE
不在其列。
我想要真正把共享库安装在系统里面,所以不想在 Makefile 中手动去加头文件包含路径和库路径(那样的话需要修改每个 Makefile)。
解决 gcc 找不到头文件的问题
设置 INCLUDE
环境变量,但是 gcc 不认。如果认的话理应输出 ignoring nonexistent directory "/aaaa"
。
$ env INCLUDE=/aaaa gcc -E -Wp,-v - </dev/null
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/12/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/12/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
# 0 "<stdin>"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "<stdin>"
https://stackoverflow.com/a/2497388/ 回答指出以下环境变量被 gcc 识别第一个是不分语言的,后面几个是分语言的。还是用上面的方式测试,包含路径能被正常识别。
CPATH
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
OBJC_INCLUDE_PATH
✔ 已成功。
解决 gcc 找不到共享库的问题
试过 ldconfig -p
能找到,但是 gcc 依然找不到。
同样考虑使用环境变量的方式,我在 https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html 找到了类似的说明,可以使用 LIBRARY_PATH
来指定 gcc 在链接阶段去检查的路径。
✔ 已成功。
Note
gcc 在链接阶段(调用 ld
)并不直接使用 LD_LIBRARY_PATH
,而是使用 LIBRARY_PATH
。前者是在可执行程序运行时,系统的链接器搜索动态链接库的路径。
其他
能不能不通过环境变量的方式处理问题,而是将配置写进系统呢?