使用 ldconfig 和 ld.so.conf 与 LD_LIBRARY_PATH

使用 ldconfig 和 ld.so.conf 与 LD_LIBRARY_PATH

我经常从源代码构建各种库来使用,例如 gmp-6.1.2、mpfr-4.0.1 和 gcc-7.x。这样做时,我更喜欢使用它,--prefix=/usr/local/gcc-7.2.0这样我就可以确切地知道它的安装位置,并且不会弄乱现有的库。然后我基本上知道的是make install最后告诉我的是更新或设置LD_LIBRARY_PATH,有时但并非总是如此LD_RUN_PATH

大多数时候,我只是LD_LIBRARY_PATH稍后根据需要手动设置,或者以类似的方式全局设置它,/etc/bash.bashrc.local并且已经起作用了。

这就是说make install

Libraries have been installed in:
  /usr/local/mfprtest/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
  - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
    during execution
  - add LIBDIR to the 'LD_RUN_PATH' environment variable
    during linking
  - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
  - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

有没有更好的办法,或者更官方的方式?使用ldconfig and ld.so.conf比使用LD_LIBRARY_PATHand LD_RUN_PATH, and PATH?这是专门用于编写我自己的代码,但也可能适用于其他用户,我想链接到比给定 Linux 版本安装的库更新的各种版本,例如 gmp、mpfr,然后使用各种手动安装的版本gcc 的,例如 gcc-5.x 或 gcc-6.x 或 gcc-7.x。

基本上,例如,一旦安装/usr/local/gcc-7.3.0,我希望自己和任何其他在系统上编写或运行自制 c、c++ 或 fortran 源代码的用户使用/usr/local/gcc-7.3.0而不是 /usr/bin/ 和 /usr/ 中的系统版本库64/

答案1

解决方案是将您的库目录添加/usr/local/gcc-7.3.0/lib//etc/ld.so.conf(或 中的文件/etc/ld.so.conf.d/)并运行ldconfig或更改用户的 shell 配置文件以覆盖系统的LD_LIBRARY_PATH/LD_RUN_PATH并添加单独的*/lib条目,以便链接器可以找到共享对象。

一旦开始添加库,维护的复杂性就会增加,因此请记住这一点。

您的另一个选择是链接 中的所有文件/usr/local/<library>/{bin,lib,include} into /usr/local/{bin,lib,include}。这极大地简化了ld.so.confor LD_LIBRARY_PATH/LD_RUN_PATH尽管您将需要忍受混乱/usr/local/{bin,lib,include}

执行此操作的“官方”方法是使用系统的包管理器并在所选位置( 、 等)安装发行版的库的维护/usr/lib/版本/lib

答案2

对于可执行文件(与库相反),用户需要PATH在其环境中进行正确的设置。这可以通过它们自己的 shell 启动文件或系统范围的启动文件来完成,例如通过/etc/profile(但请注意,不保证在所有配置下都能读取该文件)。

现在,对于库,例如 GMP 和 MPFR:

  1. 如果您在构建 GCC 时使用了运行路径,则无需执行任何其他操作即可使用 GCC:将通过运行路径找到库。
  2. 否则,或者如果您希望用户能够直接将库用于其他目的(例如使用他们自己的软件),那么使用ldconfig(可能/etc/ld.so.conf)可能是最好的解决方案。但请注意,如果用户想要针对这些库进行编译,他们还需要LIBRARY_PATHand CPATH(或C_INCLUDE_PATH等)。

注意:LD_LIBRARY_PATH对于临时的事情(例如测试)和安装在用户主目录中的库仍然有用(似乎没有相当于ldconfig用户端配置)。但它可能覆盖运行路径,这在某些情况下是一个问题(例如,make check检查刚刚构建的库以及已经安装了早期兼容版本的库)。

相关内容