为什么用 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。前者是在可执行程序运行时,系统的链接器搜索动态链接库的路径。

其他

能不能不通过环境变量的方式处理问题,而是将配置写进系统呢?