gnupg'libgpg-error.so.0没有可用的版本信息'

我试图为Debian Wheezy编译gnupg-2.1.0,我已经下载并编译了所需的库( libgpg-error-1.17libgcrypt-1.6.2libksba-1.3.2libassuan-2.1.3pth-2.0.7 ),通过./configure make install 。 然后,我将/usr/local/lib/etc/ld.so.conf ,然后运行ldconfig以便gnupg可以find这些库。

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) 

为什么这个错误发生,我怎么修复它?

parsing度

通过export LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH}将/ 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

问题的根源

错误发生是因为在编译时,在search系统默认path之前它正在正确search/usr/local/libpath,因此在链接时parsing所有符号。 然而,在运行时,在预先存在的/lib/i386-linux-gnu之前不会search/usr/local/libpath,因此它在/usr/local/lib目录中find相同名称的库, /usr/local/lib

解决scheme,简单的版本:全局库searchpath(与警告)

简单的版本是将/usr/local/lib插入LD_LIBRARY_PATH环境variables或/etc/ld.so.confconfiguration,然后运行ldconfig 。 对于“快速”解决scheme,您希望在/usr/local/lib之前做任何其他事情。

然而,这是不幸的一点,你不想强制所有的程序在系统库path之前search/usr/local/lib (例如: /lib/i386-linux-gnu ) – 这使得它很可能您将导致与系统或软件包pipe理器提供的另一个程序使用的系统库发生版本冲突,并导致系统程序失败。 这意味着要“做正确的事情”,你不想使用LD_LIBRARY_PATHLD_PRELOAD/etc/ld.so.conf来强制你的searchpath。 ( 其实LD_PRELOAD应该避免在开发工作之外

解决scheme,稳定版本:更新ELF RPATH

相反,在编译自己的应用程序版本时,可以使用LD_RUN_PATH环境variables(gnu ld&gold)或将LDFLAGS设置为-Wl,-rpath /usr/local/lib来pipe理二进制文件的内部库searchpath(包括.so共享库依赖项)

例如,你可以运行以下命令来configuration你的库:

 export LD_RUN_PATH=/usr/local/lib ./configure --prefix=/usr/local <--yourflags> make install 

我对这种技术的使用经验是在HP-UX上, chatr实用程序会向您显示embedded的rpath(并且链接标志是+b而不是-rpath)。 readelfobjdump可能会在linux上显示rpath。

patchelf声称能够更新linux x86上的现有二进制文件的rpath,但是我没有自己testing。

我和Ubuntu有同样的问题(12和14和16,Gnome和Xfce,完全不同的机器……),我从头开始编译整个东西。 有趣的,根本没有帮助。 同样的错误:需要版本2,没有与松林等的沟通。

删除了旧的1.4 – 愚蠢的错误! 它们被devise为共存(1.x和2.x)。

解决scheme实际上是这样的:请使用Ubuntu CLI安装gnupg2:

 sudo apt-get install gnupg2 

做了这个工作。 所有4台机器和所有版本。 太简单了,太酷了。 就像一个魅力:-)解决(至less在我的动物园安装)