gpt4 book ai didi

c++ - 使 ld 忽略/etc/ld.so.conf 中的目录

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:26 29 4
gpt4 key购买 nike

长话短说:

有没有办法让我(没有 root 访问权限)使链接器(由 gcc 调用)不知道 /etc/ld.so.conf 中包含的目录的内容 在通过 ldconfig 缓存之后?

详细说明:

我正在尝试(但失败了)在没有 root 访问权限的自定义 linux 发行版上编译 HTCondor。由于各种原因(见下文),我认为我遇到的问题与 native 上安装了两个版本的 libssl 和两个版本的 libcrypto 有关。其中每一个的较新版本 (1.0.0) 位于 /usr/lib64 而旧版本 (0.9.8) 保留在 /usr/local/lib64 出于兼容性原因。 /etc/ld.so.conf 包含这两个路径,因此链接器知道这两个路径。

编译时出现错误

../condor_utils/libcondor_utils_8_7_9.so: undefined reference to `ERR_remove_thread_state'

由于某些原因,libcondor_utils_8_7_9.so 链接到 libcrypto.so.0.9.8,而 ERR_remove_thread_state 是在 1.0 中引入的.0。它在源代码中只出现一次:

#if OPENSSL_VERSION_NUMBER < 0x10000000L
ERR_remove_state( 0 );
#elif OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
ERR_remove_thread_state( 0 );
#endif

所以预处理器似乎是根据版本 1.0.0 做出决定的。

This 问题让我注意到了 this 博客文章,所以我尝试用以下脚本替代 cpp:

#!/bin/bash
/usr/bin/gcc -Wl,-rpath-link="/usr/lib64",-rpath="/usr/lib64" "$@"

不幸的是,没有用。

为了解决这个问题,我还尝试在上面的源代码片段中注释预处理器指令以强制选择 ERR_remove_state。这导致链接器警告我 libssl.so.1.0.0 可能与 libssl.so.0.9.8 冲突,并且毫不奇怪地产生另一个“ undefined reference ”错误.

编辑:

事实证明问题根本与链接器无关。看我的回答。但是,出于好奇,我会留下这个问题,看看是否有人在其原始公式中有解决方案。

最佳答案

@user463035818 和@jww 的评论为我指明了解决我的具体问题的正确方向,结果证明这与链接器没有直接关系。

Condor 使用 cmake 作为构建系统,因此显然尝试在 cmake 级别(此处为 n00b)解决此问题更有意义。在 cmake 做的所有事情的深处某处,它找到了两个版本的库并出于某种原因将它们混合在一起。根据 this 使用特定版本调用 find_library主要的 CMakeLists.txt 中的答案解决了这个问题,尽管它在我嘴里留下了肮脏解决方法的坏味道。

根据 docs,让 cmake 在查找库时忽略某个目录应该不难.不过我还没有尝试过。

关于c++ - 使 ld 忽略/etc/ld.so.conf 中的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52818600/

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