--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
すると、新しいバージョンのライブラリが確実に使用されるようになります。しかし、-rpath
とLD_LIBRARY_PATH
はどちらもハックであり、慎重に検討せずにアプリケーション バイナリを誰かに渡そうとすると、別の問題が発生します。
これらすべてに対する非ハックなアプローチは、新しい共有ライブラリをシステムに既に知られているディレクトリにインストールすることを保証することです。ライブラリの既存のバージョンがそこにある場合、それはおそらく/usr/libを意味します。
--prefix=/usr
これは、libpcap をビルドするときに configure コマンドに追加することで実行できます。そこに新しい libpcap をインストールすると、追加のリンカー オプションなしでアプリケーションをコンパイルしてリンクできるようになります。
ただし、これはパッケージ管理に干渉するため、パッケージ マネージャーを介して更新するときに他の問題が発生します。そのため、最初にシステムの libpcap パッケージをアンインストールするか、CentOS のシステム パッケージを置き換える正しい方法を調べてください。