我是否有一种方法(没有root访问权限),使链接器(由gcc
调用)在通过{{1 }}?
我正在尝试(并且失败)在没有root用户访问权限的定制Linux发行版上编译HTCondor。由于各种原因(请参阅下文),我相信我遇到的问题与以下事实有关:在此计算机上安装了两个版本的libssl和两个版本的libcrypto。出于兼容性原因,每个版本的较新版本(1.0.0)位于/etc/ld.so.conf
,较旧版本(0.9.8)被保留在ldconfig
。 /usr/lib64
包含这两个路径,因此链接器会同时知道这两个路径。
在编译过程中出现错误
/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
在1.0.0中引入。它在源代码中只出现一次:
libcrypto.so.0.9.8
所以预处理程序似乎是根据1.0.0版做出决定的。
This这个问题使我意识到this博客文章,因此我尝试使用以下脚本替代ERR_remove_thread_state
:
#if OPENSSL_VERSION_NUMBER < 0x10000000L
ERR_remove_state( 0 );
#elif OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
ERR_remove_thread_state( 0 );
#endif
不幸的是,这无济于事。
仅此而已,我还尝试在上面的源代码片段中注释前置命令,以强制选择cpp
。这导致链接器警告我#!/bin/bash
/usr/bin/gcc -Wl,-rpath-link="/usr/lib64",-rpath="/usr/lib64" "$@"
可能与ERR_remove_state
发生冲突,并且毫不奇怪地,还会产生另一个“未定义的引用”错误。
该问题根本与链接器无关。看我的答案。但是,出于好奇,我将悬而未决,以查看是否有人有原始解决方案的解决方案。