2013-06-29 117 views
2

我已經在我的mac中使用clang安裝了boost。如何使用clang鏈接boost庫1.54?

Include = /usr/local/include/boost-1_54/ 
Lib = /usr/local/lib/ 

(libboost_atomic - 鐺 - darwin42-MT-1_54.a,libboost_math_c99f - 鐺 - darwin42-MT-1_54.dylib)

,然後我想測試如果安裝不見了正確與否。我嘗試編譯使用boost :: regex的簡單代碼。

$$ clang++ -I /usr/local/include/boost-1_54/ -L /usr/local/lib/ -o regex test_regex.cpp 

它給出錯誤說

Undefined symbols for architecture x86_64: 
"boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)", referenced from: 
    boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> >   >::assign(char const*, char const*, unsigned int) in test_regex-qSWMLF.o 
"boost::re_detail::get_mem_block()", referenced from: 
    boost::re_detail::perl_matcher<std::__1::__wrap_iter<char const*>, std::__1::allocator<boost::sub_match<std::__1::__wrap_iter<char const*> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::extend_stack() in test_regex-qSWMLF.o 
    boost::re_detail::save_state_init::save_state_init(boost::re_detail::saved_state**, boost::re_detail::saved_state**) in test_regex-qSWMLF.o 
"boost::re_detail::put_mem_block(void*)", referenced from: 
    boost::re_detail::save_state_init::~save_state_init() in test_regex-qSWMLF.o 
    boost::re_detail::perl_matcher<std::__1::__wrap_iter<char const*>, std::__1::allocator<boost::sub_match<std::__1::__wrap_iter<char const*> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::unwind_extra_block(bool) in test_regex-qSWMLF.o 
"boost::re_detail::verify_options(unsigned int, boost::regex_constants::_match_flags)", referenced from: 
    boost::re_detail::perl_matcher<std::__1::__wrap_iter<char const*>, std::__1::allocator<boost::sub_match<std::__1::__wrap_iter<char const*> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match_imp() in test_regex-qSWMLF.o 
"boost::re_detail::raise_runtime_error(std::runtime_error const&)", referenced from: 
    void boost::re_detail::raise_error<boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > >(boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::error_type) in test_regex-qSWMLF.o 
"boost::re_detail::get_default_error_string(boost::regex_constants::error_type)", referenced from: 
    boost::re_detail::cpp_regex_traits_implementation<char>::error_string(boost::regex_constants::error_type) const in test_regex-qSWMLF.o 
"boost::re_detail::cpp_regex_traits_implementation<char>::transform_primary(char const*, char const*) const", referenced from: 
    boost::cpp_regex_traits<char>::transform_primary(char const*, char const*) const in test_regex-qSWMLF.o 
"boost::re_detail::cpp_regex_traits_implementation<char>::transform(char const*, char const*) const", referenced from: 
    boost::cpp_regex_traits<char>::transform(char const*, char const*) const in test_regex-qSWMLF.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我記得使用-libregex或東西,而使用gcc來編譯簡單的升壓方案。我已經嘗試了所有組合,但它仍然給錯誤說(我的意思是-libboost_regex-MT,libboost_atomic - 鐺 - darwin42-MT-1_54.a,..)

$$ clang++ -I /usr/local/include/boost-1_54/ -L /usr/local/lib/ -o regex test_regex.cpp -libboost_regex 

    ld: library not found for -libregex 

誰能幫我該怎麼告訴鐺使用正確的庫函數來編譯測試正確嗎?請

+0

對不起,打擾你們這隻需要添加-lboost_regex-clang-darwin42-mt-1_54。我應該更加小心。 – solti

回答

1

現在我作爲一個初學者的OSX程序員也有這個問題,答案下面的神祕1行沒有幫助我。

經過幾個令人沮喪的時間和安裝和重新編譯提升我終於找到了如何做到這一點。 http://www.macports.org/

然後命令來下載和安裝升壓是::

我使用了一個名爲MacPorts的非常有用的程序,它可以被發現在安裝Boost庫sudo的港口安裝升壓

Boost庫,然後出現在夾/ opt/local/lib目錄

要鏈接添加以下的LD連接您的圖書館的: -lboost_regex-MT

注意實際˚F ilename是libboost_regex-mt.a,在鏈接器命令行中省略了開始處的「lib」,這些東西直到閱讀手冊頁時才拋出。

如果你這樣做,然後提升應鏈接和未定義的符號錯誤應該消失。

我希望這會有所幫助。

0

這個問題可能與使用C++標準庫有關。 前段時間,Apple默認使用libstdC++(GNU版本)切換到libC++(Clang版本)。基本上有兩種方法可以解決這個問題:

1)確保你使用的boost庫也在使用libC++;

2)重寫此默認值,並改爲使用libstdC++。

自從蘋果決定轉向CLang以來,1)從長遠來看可能是最符合流程的。 你可以通過使用命令像建設Boost庫:

$ ./bootstrap --prefix=... 
$ ./b2 toolset=clang cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" link=static install 

我當然不知道你的引導選項,您的選擇,B2可能會有所不同,例如,你可能例如要離開out'link = static',你可以提供其他編譯器或鏈接器標誌,但是這應該給你一個總體思路。

如果您想要選項2)並且正在使用XCode,您可以轉到項目的「構建設置」,然後在「C++標準庫」下選擇libstdC++而不是libC++。或者如果您不使用XCode,請從命令行執行相同的操作。