2010-10-10 38 views
0

我想在CentOS 5.5機器上安裝並使用libpcap的最新版本(1.1.1)。 我配置,編譯和由安裝新的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的圖書館(使用pcap_lib_version() API調用驗證。

我需要什麼,以便與新的libpcap庫進行鏈接呢?

在此先感謝

回答

5

沒有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添加到您的鏈接命令中肯定會確保您的新版本庫得到使用。但是-rpathLD_LIBRARY_PATH都更像是一種黑客攻擊,並且如果您嘗試在沒有仔細考慮的情況下將您的應用程序二進制文件提供給其他人,則會引入其他問題。


所有這一切的非黑客方法是確保您將新的共享庫安裝到系統已知的目錄中。這可能意味着/usr/lib如果這是庫的現有版本。

您可以通過在構建libpcap時將--prefix=/usr添加到configure命令來執行此操作。在那裏安裝新的libpcap後,您應該能夠編譯並鏈接您的應用程序,而無需任何額外的鏈接器選項。

但是這會干擾包管理,因此在通過包管理器進行更新時會導致其他問題。因此,您可能需要首先卸載系統libpcap軟件包,或者一般來看正確的方式來替換CentOS上的系統軟件包。