我正在尝试为 Debian Wheezy 编译 gnupg-2.1.0,我已经通过、、下载并编译了所需的库( libgpg-error-1.17
、、、、和,按顺序)。然后我添加到并运行,libgcrypt-1.6.2
以便gnupg 可以找到这些库。libksba-1.3.2
libassuan-2.1.3
pth-2.0.7
./configure
make
make install
/usr/local/lib
/etc/ld.so.conf
ldconfig
Gpupg 编译正常,但在尝试运行或时./agent/gpg-agent
出现./g10/g
此错误:
alpha@virtual:~/gnupg-2.1.0$ ./agent/gpg-agent --version
./agent/gpg-agent: /lib/i386-linux-gnu/libgpg-error.so.0: no version information available (required by ./agent/gpg-agent)
./agent/gpg-agent: /lib/i386-linux-gnu/libgpg-error.so.0: no version information available (required by /usr/local/lib/libgcrypt.so.20)
./agent/gpg-agent: relocation error: ./agent/gpg-agent: symbol gpgrt_set_alloc_func, version GPG_ERROR_1.0 not defined in file libgpg-error.so.0 with link time reference
ldd ./agent/gpg-agent
生产
root@virtual:/home/alpha/gnupg-2.1.0# ldd ./agent/gpg-agent
./agent/gpg-agent: /lib/i386-linux-gnu/libgpg-error.so.0: no version information available (required by ./agent/gpg-agent)
./agent/gpg-agent: /lib/i386-linux-gnu/libgpg-error.so.0: no version information available (required by /usr/local/lib/libgcrypt.so.20)
linux-gate.so.1 => (0xb7750000)
libgcrypt.so.20 => /usr/local/lib/libgcrypt.so.20 (0xb7698000)
libgpg-error.so.0 => /lib/i386-linux-gnu/libgpg-error.so.0 (0xb7694000)
libassuan.so.0 => /usr/lib/i386-linux-gnu/libassuan.so.0 (0xb7681000)
libnpth.so.0 => /usr/local/lib/libnpth.so.0 (0xb767d000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb7664000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb74ff000)
librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb74f6000)
/lib/ld-linux.so.2 (0xb7751000)
为什么会发生此错误?我该如何修复它?
解决
通过将 /usr/local/lib 添加到 LD_LIBRARY_PATH 来export LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH}
解决echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
答案1
问题的根源
发生此错误的原因是,在编译时,它/usr/local/lib
在搜索系统默认路径之前正确地搜索了路径,因此在链接时,所有符号都已解析。但是在运行时,/usr/local/lib
不会在预先存在的路径之前搜索您的路径/lib/i386-linux-gnu
,因此它会在后一个目录中找到同名库,然后再找到所需的库/usr/local/lib
。
解决方案,简易版:全局库搜索路径(有警告)
简单的版本是插入/usr/local/lib
环境LD_LIBRARY_PATH
变量或/etc/ld.so.conf
配置,然后运行ldconfig
。对于“快速”解决方案,您需要/usr/local/lib
先执行其他任何操作。
然而,不幸的是,你不是想要强制所有程序/usr/local/lib
在系统库路径之前进行搜索(例如:/lib/i386-linux-gnu
)——这很可能会导致与系统或包管理器提供的另一个程序使用的系统库发生版本冲突,并导致系统程序失败。这意味着要“正确行事”,您不想使用LD_LIBRARY_PATH
,LD_PRELOAD
或/etc/ld.so.conf
强制搜索路径。(事实上,LD_PRELOAD
应该避免在开发工作之外)
解决方案,稳定版本:更新ELF RPATH
相反,在编译您自己的应用程序版本时,您可以使用LD_RUN_PATH
环境变量(gnu ld 和 gold)或设置LDFLAGS
来-Wl,-rpath /usr/local/lib
管理二进制文件的内部库搜索路径(包括 .so 共享库依赖项)
例如,您可以运行以下命令来配置您的库:
export LD_RUN_PATH=/usr/local/lib
./configure --prefix=/usr/local <--yourflags>
make install
我使用此技术的经验是在 HP-UX 上,其中chatr
实用程序将显示嵌入的 rpath(并且链接标志代替+b
-rpath)。readelf
或者objdump
可能会在 linux 上显示 rpath。
补丁声称能够更新 Linux x86 上现有二进制文件中的 rpath,但我自己还没有测试过。
答案2
我在使用 Ubuntu 时也遇到了同样的问题(12、14 和 16、Gnome 和 Xfce,完全不同的机器......),我从头开始编译了所有内容。有趣的是,根本没有帮助。同样的错误:需要版本 2,无法与 pinentry 通信等等。
删除了旧的 1.4 - 愚蠢的错误!它们被设计为共存(1.x 和 2.x)。
解决方案实际上是这样的:使用 Ubuntu CLI 安装 gnupg2:
sudo apt-get install gnupg2
完成了工作。适用于所有 4 台机器和所有版本。非常简单,非常酷。效果非常好 :-) 已解决(至少在我的安装动物园中)
答案3
对我来说,在很久以前,我曾构建并安装到 /usr/local(lib 和 bin),这会隐藏新版本。只需检查 /usr/local 中的影子可执行文件和库,然后运行 ldconfig 和 hash -r,即可轻松解决。
答案4
之前已经安装过gnupg 2.2.x在我的计算机上,当我尝试安装最新的gnupg 2.4.x,我遇到了这个错误(在进行检查)。解决方案是卸载(并清理)以前的版本,然后构建最新版本。