我试图为Debian Wheezy编译gnupg-2.1.0,我已经下载并编译了所需的库( libgpg-error-1.17 , libgcrypt-1.6.2 , libksba-1.3.2 , libassuan-2.1.3和pth-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)
为什么这个错误发生,我怎么修复它?
通过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_PATH , LD_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)。 readelf或objdump可能会在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在我的动物园安装)