0

CentOS 5.5 マシンに libpcap の最新バージョン (1.1.1) をインストールして使用したいと考えています。次の方法で、新しい 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 共有ライブラリとリンクしようとすると、アプリケーションは古いバージョンの libpcap ライブラリにリンクされます ( API 呼び出し-lpcapを使用して検証されます)。pcap_lib_version()

新しい libpcap ライブラリとリンクするにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

5

--prefixまたは他のインストール場所オプションを指定せずに構成すると、デフォルトで新しい libpcap が/usr/local/libにインストールされます。おそらく、上書きしようとしている古いバージョンはシステム CentOS のものであり、/usr/libにもあります。

したがって、リンカは/usr/local/ lib の前に/usr /libを検索しているように見えます。

-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して並べ替え、新しいライブラリを取得できます。しかし、実際にはそれはハックです。


リンク時に問題が発生した場合のすべてです。この共有ライブラリのバージョン管理方法によっては、動的リンク中にアプリケーションを実行するときに実際の問題が発生する場合があります。または、おそらく両方のビット。

アプリケーションで ldd を実行すると、libpcap のどのパスが表示されますか? でアプリケーションを構築した場合はどう-L/usr/local/libですか?

ldd yourapp

ダイナミック リンカーに/usr/local/lib内の共有ライブラリを強制的に検出させるには、リンカーの-rpathオプションまたはLD_LIBRARY_PATH環境変数を調べます。リンクコマンドに追加-L/usr/local/lib -Wl,-rpath,/usr/local/libすると、新しいバージョンのライブラリが確実に使用されるようになります。しかし、-rpathLD_LIBRARY_PATHはどちらもハックであり、慎重に検討せずにアプリケーション バイナリを誰かに渡そうとすると、別の問題が発生します。


これらすべてに対する非ハックなアプローチは、新しい共有ライブラリをシステムに既に知られているディレクトリにインストールすることを保証することです。ライブラリの既存のバージョンがそこにある場合、それはおそらく/usr/libを意味します。

--prefix=/usrこれは、libpcap をビルドするときに configure コマンドに追加することで実行できます。そこに新しい libpcap をインストールすると、追加のリンカー オプションなしでアプリケーションをコンパイルしてリンクできるようになります。

ただし、これはパッケージ管理に干渉するため、パッケージ マネージャーを介して更新するときに他の問題が発生します。そのため、最初にシステムの libpcap パッケージをアンインストールするか、CentOS のシステム パッケージを置き換える正しい方法を調べてください。

于 2010-10-11T01:26:14.520 に答える