2011-10-22 63 views
1

我想在Ubuntu 11.10下使用從存儲庫安裝的boost 1.42來編譯C++程序(我也嘗試過構建boost自己,但結果與repo-boost相同)。源文件編譯,但鏈接器給錯誤...我試過了幾個小時也沒有找到一個解決這個,也許有人可以幫我...在Linux上與GCC的Boost鏈接

下面是Makefile中的目標

CXX = /usr/bin/g++ 

LDFLAGS = -L. \ 
      -Lpath/to/libMy_Lib.a 

CFLAGS = -I. \ 
     -Wall \ 
     -g \ 
     -O0 

OBJECTS = obj1.o obj2.o 

%.o: %.cpp 
    $(CXX) -c $*.cpp -o [email protected] \ 
     -Wno-deprecated \ 
      $(CFLAGS) 

all: program 

program: $(OBJECTS) 
    $(CXX) $^   \ 
    $(LDFLAGS)   \ 
    -o myProg   \ 
    -lboost_regex  \ 
    -lboost_filesystem \ 
    -lboost_date_time \ 
    -lboost_system  \ 
    -lboost_thread  \ 
    -lMy_Lib 

libMy_Lib.a是一個庫,它也使用boost(我沒有問題在同一個系統上編譯它)。所有的庫看在/ usr/lib中確定...

這裏是輸出LD生成(我用的化妝2>輸出)http://ubuntuone.com/6QlU7AUZGgLGIu7sHbvDHm

也許庫的順序是不正確的(我知道boost_filesystem取決於boost_system,但我不知道其餘的)或我忘了指定一些額外的庫,我的程序需要鏈接到...

這真的buggs我,我覺得我是盲目的沒有看到它...

+0

類似的問題,以 http://stackoverflow.com/questions/559179/linking-to-boost-regex-in-gcc – fazo

回答

1

這些錯誤信息令人印象深刻:

../../DIAG_DECODER//libDecoder_Element.a(BaseElements_Group.o): In function `bool boost::regex_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)': 
BaseElements_Group.cpp:(.text._ZN5boost11regex_matchIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEbT_SD_RNS_13match_resultsISD_T0_EERKNS_11basic_regexIT1_T2_EENS_15regex_constants12_match_flagsE[bool boost::regex_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)]+0x4c): 
undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match()' 

我加了一個換行符「未定義參考」前...

我想你也許應該列出你的圖書館,它使用升壓功能,之前的任何Boost庫的。

+0

這是我的一個實際滑動起來(我工作一段時間,累了)。非常感謝:) – Adi

+0

另外,我剛剛注意到,你應該在-L之後列出目錄,而不是文件。然後允許在目錄中找到使用'-lname'指定的庫。 –

+0

那麼通過/path/to/myLib.a我指的是現實中lib的路徑,而不是lib本身......也許如果我把另一個/放在名稱的末尾,它會更加明顯是一個目錄:) – Adi