2010-10-10 5 views
0

Я хотел бы установить и использовать последнюю версию (1.1.1) libpcap на машине CentOS 5.5. я настроил, скомпилировать и установить новую библиотеку Libpcap по:Ссылка на новую версию библиотеки libpcap

[[email protected] libpcap-1.1.1]$ ./configure 
[[email protected] libpcap-1.1.1]$ make 
[[email protected] libpcap-1.1.1]$ sudo make install 

Но когда я пытаюсь связать с Libpcap разделяемой библиотеки (используя флаг -lpcap компоновщика) мое приложение связано со старой версией библиотеки Libpcap (проверяется с помощью вызова API pcap_lib_version().

Что мне нужно сделать для того, чтобы связать с новой библиотекой Libpcap?

заранее спасибо

ответ

5

Настройка без SPECI fying --prefix или другие параметры местоположения установки, по умолчанию, установили новый libpcap в /usr/local/lib. Предположительно, старая версия, которую вы пытаетесь переопределить, - это система CentOS, и она находится в /usr/lib.

Поэтому, казалось бы, что компоновщик ищет /USR/Библиотека перед тем /USR/местные/Библиотека.

Вы можете увидеть, какие именно Libpcap в настоящее время связаны с добавлением -Wl,-Map,foo.map к команде GCC, который связывающей ваше приложение, и получившийся оглавлению foo.map файл для libpcap.

Вы можете увидеть путь поиска библиотек, которые компоновщик использует смотря на выходе (оба)

gcc -print-search-dirs | grep ^libraries 
ld --verbose | grep SEARCH_DIR 

Если /USR/Lib появляется перед /USR/местные/Библиотека , вы можете добавить -L/usr/local/lib в свою команду связи, чтобы изменить порядок и получить новую библиотеку. Но на самом деле это взломать.


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

Какой путь вы видите в списке для libpcap при запуске ldd в вашем приложении? Как насчет того, когда вы создали свое приложение с помощью -L/usr/local/lib?

ldd yourapp 

Чтобы заставить динамический компоновщик, чтобы найти вашу разделяемую библиотеку в /USR/местные/Библиотека, вы хотели бы посмотреть в -rpath вариант компоновщиком, или переменной в LD_LIBRARY_PATH среды. Добавление -L/usr/local/lib -Wl,-rpath,/usr/local/lib в вашу команду связи обязательно обеспечит вашу новую версию библиотеки. Но и -rpath, и LD_LIBRARY_PATH являются еще более взломанными и представляют другие проблемы, если вы попытаетесь дать свое приложение двоичным для кого-то другого без тщательного рассмотрения.


Не-хак подход все это для того, чтобы установить новую общую библиотеку в каталог, который уже известен системе.Это, вероятно, означает /usr/lib, если это где находится существующая версия библиотеки.

Вы можете сделать это, добавив --prefix=/usr в команду configure при создании libpcap. После установки нового libpcap вы сможете скомпилировать и связать свое приложение с ним без каких-либо дополнительных опций компоновщика.

Однако это мешает управлению пакетами, поэтому это вызовет другие проблемы при обновлении через диспетчер пакетов. Таким образом, вы можете сначала удалить пакет libpcap или, в общем, взглянуть на правильные способы замены системных пакетов на CentOS.

Смежные вопросы