gpt4 book ai didi

gcc - 带有自定义 gcc 安装的 LIBRARY_PATH 的优先级

转载 作者:行者123 更新时间:2023-12-03 17:34:43 32 4
gpt4 key购买 nike

有没有办法让编译器更喜欢 LIBRARY_PATH 中的库?而不是系统路径。我特别在寻找 Clang。我在写这个问题时部分解决了 GCC 的问题,但也不是很清楚。
背景LIBRARY_PATH是一个方便的环境变量,允许 透明 链接非标准目录中的库,例如用户安装,在我的情况下是提供 的环境模块不同版本的图书馆。
这个想法是做一个module load libfoo/version并且编译器将透明地使用正确的libfoo.so .
对于共享库,还需要设置LD_LIBRARY_PATH对于 ld.so找到合适的图书馆。如果有多个 libfoo.so在这两个 LD_LIBRARY_PATH/usr/lib , ld.so指定 LD_LIBRARY_PATH在默认路径之前搜索。
问题
我在库定义 soname 时遇到了问题- 这两个 libfoo.so 不同libfoo.so.1 中的版本(分别是 libfoo.so.2/usr/lib 的符号链接(symbolic link))和 LIBRARY_PATH .然后ld将链接到 soname/usr/libLD_LIBRARY_PATH不能再优先考虑预期的库。
我第一次遇到这个是用 boost 的,但这里有一个小例子:

echo "void foo() {}" > foo.c

# create an old libfoo version in /usr/lib
sudo gcc foo.c -fpic -shared -o /usr/lib/libfoo.so.1 -Wl,-soname,libfoo.so.1
sudo ln -s libfoo.so.1 /usr/lib/libfoo.so

# create the new libfoo that we want to transparently override
mkdir -p /tmp/XXX/lib
gcc foo.c -fpic -shared -o /tmp/XXX/lib/libfoo.so.2 -Wl,-soname,libfoo.so.2
ln -s libfoo.so.2 /tmp/XXX/lib/libfoo.so

export LIBRARY_PATH=/tmp/XXX/lib
export LD_LIBRARY_PATH=/tmp/XXX/lib

echo "void foo(); int main() { foo(); }" > main.c
gcc main.c -lfoo
ldd a.out| grep foo
# under some conditions this shows libfoo.so.1 instead of .2
libfoo.so.1 => /usr/lib/libfoo.so.1
海合会
我最初在自定义安装 GCC 时遇到了这个问题,而它在系统安装中按预期工作。 gcc --print-search-dirs揭示了一个模式:
/tmp/XXX/lib/x86_64-pc-linux-gnu/7.2.0/
/tmp/XXX/lib/x86_64-linux-gnu/
/tmp/XXX/lib/../lib64/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../x86_64-pc-linux-gnu/lib/x86_64-pc-linux-gnu/7.2.0/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../x86_64-pc-linux-gnu/lib/x86_64-linux-gnu/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../x86_64-pc-linux-gnu/lib/../lib64/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../x86_64-pc-linux-gnu/7.2.0/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../x86_64-linux-gnu/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib64/
/lib/x86_64-pc-linux-gnu/7.2.0/
/lib/x86_64-linux-gnu/
/lib/../lib64/
/usr/lib/x86_64-pc-linux-gnu/7.2.0/
/usr/lib/x86_64-linux-gnu/
/usr/lib/../lib64/
/tmp/XXX/lib/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../x86_64-pc-linux-gnu/lib/
/opt/gcc/7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../
/lib/
/usr/lib/
除了正常的搜索优先级 - LIBRARY_PATH出现在系统路径之前,GCC 优先考虑一些“前缀”,包括 ../lib64 .这可以通过创建另一个符号链接(symbolic link)来解决:
ln -s lib /tmp/XXX/lib64
我认为这与 --libdir 有关 configure期间的参数,我省略了,是 /usr/lib在系统安装中,但即使我指定 --libdir=$PREFIX/lib --libexecdir=$PREFIX/lib , 它更喜欢 ../lib64 .
如何编译或控制gcc在运行时,至少使用 ../lib而不是 ../lib64后缀?

Clang 更是不合作。它不包括 LIBRARY_PATH--print-search-dirs 的输出中甚至不包括 -L/tmp/XXX/lib来电 ld如果 libfoo.so可以在 /usr/lib 中找到.
如何让 Clang 透明地优先考虑我的库路径?
笔记
  • 示例来自 Archlinux,但我也在 Ubuntu 16.04 下进行了测试,其行为类似。
  • GCC 的相关问题:Why does g++ look in LIBRARY_PATH/../lib64 and where is this documented?g++ searches /lib/../lib/, then /lib/ .
  • -L 覆盖搜索顺序有效,但不透明。
  • gcc --print-search-dirs列出的目录多于 gcc -v .后者过滤掉非退出路径。
  • 最佳答案

    我发现了自定义安装 GCC 不同的原因。 Debian 发行版修补了 GCC makefile,这就是它如何获得正确的优先级 LIBRARY_PATH .在构建 GCC 之前,找到 gcc/config/i386/t-linux64并改变所有MULTILIB_OSDIRNAMES到这些行:

    MULTILIB_OSDIRNAMES = m64=../lib$(call if_multiarch,:x86_64-linux-gnu)
    MULTILIB_OSDIRNAMES+= m32=../lib32$(call if_multiarch,:i386-linux-gnu)
    MULTILIB_OSDIRNAMES+= mx32=../libx32$(call if_multiarch,:x86_64-linux-gnux32)

    另加 --libexecdir=/your/custom/path/lib --libdir=/your/custom/path/libconfigure .

    关于gcc - 带有自定义 gcc 安装的 LIBRARY_PATH 的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47248287/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com