沒有SPECI配置在--prefix
或其他安裝位置選項中,默認情況下,將在/usr/local/lib上安裝新的libpcap。據推測,你試圖覆蓋的舊版本是CentOS系統,而/usr/lib也是如此。
因此它會出現在鏈接程序之前搜索/usr/lib目錄在/ usr/local/lib目錄。
您可以準確地看到哪些libpcap的被加入-Wl,-Map,foo.map
到被鏈接應用程序的GCC命令,grepping產生的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如果這是庫的現有版本。
您可以通過在構建libpcap時將--prefix=/usr
添加到configure命令來執行此操作。在那裏安裝新的libpcap後,您應該能夠編譯並鏈接您的應用程序,而無需任何額外的鏈接器選項。
但是這會干擾包管理,因此在通過包管理器進行更新時會導致其他問題。因此,您可能需要首先卸載系統libpcap軟件包,或者一般來看正確的方式來替換CentOS上的系統軟件包。