Я пытаюсь скомпилировать 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
Основная причина проблемы
Ошибка возникает из-за того, что во время компиляции выполняется правильный поиск /usr/local/lib
path перед поиском системного пути по умолчанию, поэтому во время связывания все символы разрешаются. Однако во время выполнения ваш /usr/local/lib
путь не ищется до уже существующего /lib/i386-linux-gnu
поэтому он находит библиотеку с одинаковым именем в последнем каталоге перед желаемой библиотекой в /usr/local/lib
.
Решение, простая версия: путь поиска в глобальной библиотеке (с оговоркой)
Самый простой вариант - вставить /usr/local/lib
в твоем LD_LIBRARY_PATH
переменная окружения или /etc/ld.so.conf
config затем запустите 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.
патчелф утверждает, что может обновлять rpath в существующих двоичных файлах на Linux x86, но сам я не тестировал его.
У меня были те же проблемы с Ubuntu (12, 14 и 16, Gnome и Xfce, совершенно разные машины ...), и я скомпилировал все с нуля. Интересно, совсем не помогает. те же ошибки: требуется версия 2, нет связи с pinentry и так далее.
Убрал старую 1.4 - глупая ошибка! Они предназначены для сосуществования (1.x и 2.x).
На самом деле решение было таким: установите gnupg2 с помощью интерфейса командной строки Ubuntu:
sudo apt-get install gnupg2
сделал свою работу. Со всеми 4 машинами и всеми версиями. Так просто, так круто. Работает как шарм :-) РЕШЕНО (по крайней мере, на моем зоопарке инсталляций)