2011-07-17 72 views
8

我使用macports安裝了boost。該文件似乎是在/ opt /本地/包括/升壓/未找到-lboost_system庫

我的makefile不再工作,我得到以下錯誤

Undefined symbols: 
"boost::system::generic_category()", referenced from: 
    __static_initialization_and_destruction_0(int, int)in client.o 
    __static_initialization_and_destruction_0(int, int)in client.o 
"boost::system::system_category()", referenced from: 
    boost::asio::error::get_system_category() in client.o 
    boost::system::error_code::error_code()in client.o 
    __static_initialization_and_destruction_0(int, int)in client.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [client] Error 1 

在學校的解決方案是使用-lboost_system作爲參數到g ++,但現在我已經把項目帶回了我的mac,這是行不通的。我認爲這主要是由於在學校boost文件在usr/local/lib(或類似的地方)的事實。

當我加入-lboost_system說法我得到以下信息

g++ -I/opt/local/include -lboost_system -o client client.o Packet.o 
ld: library not found for -lboost_system 
collect2: ld returned 1 exit status 
make: *** [client] Error 1 

我使用-L和-l嘗試了一些變化,但我似乎無法找到一個可行的組合。在學校我也不必使用-L。我在這裏閱讀了一些關於類似問題的其他帖子,但是他們通過添加-l標誌來修復它,這些標誌不適合我。

幫助!謝謝!

回答

12

您錯過了-L/opt/local/lib。您應該能夠設置LDFLAGS在Makefile:

LDFLAGS=-L/opt/local/lib 

這假設Boost庫是當然的/opt/local/lib

如果你不使用你的Makefile通常CXXFLAGSLDFLAGS變量,然後直接添加-L/opt/local/lib在最終規則:

client: client.o Packet.o 
    g++ -L/opt/local/lib -o client client.o Packet.o -lboost_system 

-I只告訴編譯器在哪裏頭文件,鏈接器需要庫,你使用-L

+0

你會看看那!所有文件都位於/ opt/local/lib中。讓我們希望這個作品 – jim

+0

它的工作!非常感謝。我有很多要學習的。 – jim

+1

@jim你至少還有一件事要學習。如果答案正確,你需要接受答案。這就是這個合作問答系統的工作原理。 – GrafikRobot

1

你可以嘗試尋找它在你的系統是這樣的:

/sbin/ldconfig -p | grep boost_system | cut -d\> -f2 

如果安裝了庫,那麼就應該表現出這樣的事情:

/usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0 

,否則將只顯示一個空行

在你的情況下,似乎升壓安裝在另一個地方,因此需要額外的鏈接器信息,因此需要-L開關,如果你有它在/ usr/lib,因爲我有沒有需要額外的信息在生成文件