Вопрос об установке библиотеки Linux (ICU)

Я относительный новичок в установке библиотек. В настоящее время в моей системе установлена ​​более старая версия ICU (3.8), и я хочу перейти на последнюю версию (4.4).

Следуя шагам в ICU readme.html, все идет нормально (echo $? выдает все 0 для каждого шага). И я вижу, что библиотека была установлена ​​в /usr/local/lib. Однако текущая версия библиотеки установлена ​​в /usr/lib.

Мои вопросы.

1) Есть ли какая-то "организационная" или какая-то другая существенная разница между этими двумя локациями?

2) Как изменить путь установки новой библиотеки на /usr/lib?

3) Является ли библиотека находящейся в неправильном месте причиной того, что когда я запускаю даже образцы в каталоге ICU, я получаю «ошибку при загрузке общих библиотек: libicui18n.so.44»?

Спасибо всем.


person Ternary    schedule 13.09.2010    source источник


Ответы (2)


1) Материал непосредственно в /usr принадлежит вашему дистрибутиву и не должен изменяться, кроме как через менеджер пакетов. Вещи в /usr/local относятся к локальной установке, и вы можете управлять ими по своему усмотрению. Таким образом, правильно поставить локальную установку более новой libICU в /usr/local/lib.

2) Вы можете сделать это, изменив некоторые настройки при сборке ICU - я не могу дать вам конкретный совет, потому что я не знаю, какую сборку использует ICU. Однако этого делать не следует, поскольку это приведет к перезаписи файлов дистрибутива, что может привести к сколь угодно ужасной поломке.

3) Типа. Проблема не в том, что библиотека была установлена ​​не в том месте, а в том, что /usr/local/lib отсутствует в пути поиска по умолчанию. Вы можете исправить это двумя способами:

  • временно для себя с помощью этой команды оболочки:

    export LD_LIBRARY_PATH=/usr/local/lib
    
  • навсегда для всех пользователей, добавив /usr/local/lib в список в /etc/ld.so.conf, а затем запустив ldconfig от имени пользователя root.

person zwol    schedule 13.09.2010
comment
3) скорректированный LD_LIBRARY_PATH по-прежнему не сделает его видимым, например. автоконф. Для этого добавьте путь к LDFLAGS: ./configure LDFLAGS=-L/usr/local/lib. - person Benjamin Bannier; 13.09.2010
comment
Благодаря добавлению LD_LIBRARY_PATH образцы заработали правильно, спасибо. Однако, когда я пытаюсь скомпилировать свою программу (которая работала на предыдущей версии ICU), я получаю такие ошибки во время компоновки. неопределенная ссылка на `icu_44::Calendar::getNow() - person Ternary; 13.09.2010
comment
Пожалуйста, опубликуйте вывод nm -o --dynamic /usr/local/lib/libicu*.so | grep getNow. - person zwol; 13.09.2010
comment
# nm -o --dynamic /usr/local/lib/libicu*.so | grep getNow /usr/local/lib/libicui18n.so:000c48a0 T _ZN6icu_448Calendar6getNowEv /usr/local/lib/libicui18n.so:000c0940 T ucal_getNow_44 /usr/local/lib/libicutu.so: U ucal_getNow_44 - person Ternary; 13.09.2010
comment
T _ZN6icu_448Calendar6getNowEv означает, что icu_44::Calendar::getNow() действительно экспортируется вашей новой библиотекой. У вас было -licui18n в строке ссылок? - person zwol; 13.09.2010
comment
Да это оно. Но что берет -licui18n и сопоставляет его с расположением библиотеки? Версия библиотеки, поставляемая с моим дистрибутивом, все еще находится в /usr/lib, так что -licui18n может указывать на нее, а не на версию 4.4. версия, которую я установил в /usr/local/lib? - person Ternary; 14.09.2010
comment
Вполне возможно. Попробуйте добавить -L/usr/local/lib в строку ссылки (перед -licui18n). Это то, о чем Хонк говорил выше. - person zwol; 14.09.2010

  1. /usr/local — это иерархия каталогов для локально установленного программного обеспечения. /usr/bin, /usr/lib/ и т. д. предназначены для файлов, управляемых системой (т. е. управляемых вашими инструментами распространения, такими как rpm yum dselect и т. д.)
  2. Вы не должны устанавливать вещи в /usr/lib вообще
  3. Возможно, вам потребуется запустить ldconfig (от имени пользователя root), чтобы обновить библиотечный кеш, который сопоставляет имена (например, libicui18n.so.44) с путями (например, /usr/local/lib/libicui18n.so.44)

Еще одна проблема заключается в том, что если у вас система x86_64, правильный путь к библиотеке для 64-битных библиотек — /usr/local/lib64, а не /usr/local/lib. В этом случае добавьте --libdir=/usr/local/lib64 в командную строку ./configure при сборке ICU.

person Geoff Reedy    schedule 13.09.2010