我经常从源代码构建各种库来使用,例如 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_PATH
and 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.conf
or LD_LIBRARY_PATH
/LD_RUN_PATH
尽管您将需要忍受混乱/usr/local/{bin,lib,include}
。
执行此操作的“官方”方法是使用系统的包管理器并在所选位置( 、 等)安装发行版的库的维护/usr/lib/
版本/lib
。
答案2
对于可执行文件(与库相反),用户需要PATH
在其环境中进行正确的设置。这可以通过它们自己的 shell 启动文件或系统范围的启动文件来完成,例如通过/etc/profile
(但请注意,不保证在所有配置下都能读取该文件)。
现在,对于库,例如 GMP 和 MPFR:
- 如果您在构建 GCC 时使用了运行路径,则无需执行任何其他操作即可使用 GCC:将通过运行路径找到库。
- 否则,或者如果您希望用户能够直接将库用于其他目的(例如使用他们自己的软件),那么使用
ldconfig
(可能/etc/ld.so.conf
)可能是最好的解决方案。但请注意,如果用户想要针对这些库进行编译,他们还需要LIBRARY_PATH
andCPATH
(或C_INCLUDE_PATH
等)。
注意:LD_LIBRARY_PATH
对于临时的事情(例如测试)和安装在用户主目录中的库仍然有用(似乎没有相当于ldconfig
用户端配置)。但它可能覆盖运行路径,这在某些情况下是一个问题(例如,make check
检查刚刚构建的库以及已经安装了早期兼容版本的库)。