gnupg 'libgpg-error.so.0 информация о версии недоступна'
Я пытаюсь скомпилировать gnupg-2.1.0 для Debian Wheezy, я скачал и скомпилировал необходимые библиотеки (libgpg-error-1.17
, libgcrypt-1.6.2
, libksba-1.3.2
, libassuan-2.1.3
, а также pth-2.0.7
в таком порядке) через ./configure
, make
, make install
, Затем я добавил /usr/local/lib
в /etc/ld.so.conf
а потом побежал ldconfig
чтобы gnupg мог найти библиотеки.
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
3 ответа
Основная причина проблемы
Ошибка происходит, потому что во время компиляции он правильно ищет /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
вероятно покажет rpath на linux.
patchelf утверждает, что может обновить rpath в существующих двоичных файлах на linux x86, но я сам не проверял его.
У меня были те же проблемы с Ubuntu (12 и 14 и 16, Gnome и Xfce, совершенно разные машины....), и я скомпилировал все с нуля. Интересно, совсем не помогает. те же ошибки: требуется версия 2, нет связи с pinentry и так далее.
Убрал старый 1.4 - глупая ошибка! Они предназначены для сосуществования (1.x и 2.x).
Решение на самом деле было следующее: установите gnupg2 с Ubuntu CLI:
sudo apt-get install gnupg2
сделал работу. Со всеми 4 машинами и всеми версиями. Так просто, так круто. Работает как шарм:-) решено (по крайней мере, на моем зоопарке установок)
Что касается меня, в далеком прошлом я собрал и установил /usr/local(lib and bin), который стал тенью новой версии. Легко решить, проверив /usr/local на наличие теневых исполняемых файлов и библиотек, а затем запустив ldconfig и hash -r.