Связь с новой версией библиотеки libpcap - PullRequest
0 голосов
/ 11 октября 2010

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

[dima@localhost libpcap-1.1.1]$ ./configure
[dima@localhost libpcap-1.1.1]$ make
[dima@localhost libpcap-1.1.1]$ sudo make install

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

Что мне нужно сделать для связи с новой библиотекой libpcap?

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

1 Ответ

5 голосов
/ 11 октября 2010

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

Поэтому может показаться, что компоновщик ищет / usr / lib до / usr / local / lib .

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

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

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

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


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

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

ldd yourapp

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


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

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

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

...