[英]Boost.Log linker error with MacPorts on OS X 10.7
我正在嘗試在OS X 10.7上構建我的C ++庫,但由於鏈接器錯誤而導致以下消息失敗。
/usr/bin/c++ -std=c++11 -stdlib=libc++ -Wall -O2 -dynamiclib -Wl,-headerpad_max_install_names -o libCHEC.dylib -install_name /Users/oxon/libCHEC_build/libCHEC.dylib CMakeFiles/CHEC.dir/src/BasePacket.cc.o CMakeFiles/CHEC.dir/src/Buffer.cc.o CMakeFiles/CHEC.dir/src/CommandPacket.cc.o CMakeFiles/CHEC.dir/src/DataPacket.cc.o CMakeFiles/CHEC.dir/src/Event.cc.o CMakeFiles/CHEC.dir/src/Logger.cc.o CMakeFiles/CHEC.dir/src/ResponsePacket.cc.o -L/opt/local/lib -lcfitsio /opt/local/lib/libboost_log-mt.dylib /opt/local/lib/libboost_thread-mt.dylib /opt/local/lib/libboost_system-mt.dylib /opt/local/lib/libboost_unit_test_framework-mt.dylib -Wl,-rpath,/opt/local/lib
Undefined symbols for architecture x86_64:
"void boost::log::v2_mt_posix::aux::put_integer<char>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, unsigned int, unsigned int, char)", referenced from:
boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::format_fractional_seconds(boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::context&) in Logger.cc.o
boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::format_seconds(boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::context&) in Logger.cc.o
boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::format_minutes(boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::context&) in Logger.cc.o
void boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::format_hours_12<(char)48>(boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::context&) in Logger.cc.o
void boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::format_hours_12<(char)32>(boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::context&) in Logger.cc.o
void boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::format_hours<(char)48>(boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::context&) in Logger.cc.o
void boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::format_hours<(char)32>(boost::log::v2_mt_posix::aux::date_time_formatter<boost::log::v2_mt_posix::aux::decomposed_time_wrapper<boost::posix_time::ptime>, char>::context&) in Logger.cc.o
...
"boost::log::v2_mt_posix::aux::code_convert(wchar_t const*, unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::locale const&)", referenced from:
boost::log::v2_mt_posix::basic_formatting_ostream<char, std::__1::char_traits<char>, std::__1::allocator<char> >& boost::log::v2_mt_posix::basic_formatting_ostream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::formatted_write<wchar_t>(wchar_t const*, long) in Logger.cc.o
void boost::log::v2_mt_posix::basic_formatting_ostream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::aligned_write<wchar_t>(wchar_t const*, long) in Logger.cc.o
"boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char>::add_stream(boost::shared_ptr<std::__1::basic_ostream<char, std::__1::char_traits<char> > > const&)", referenced from:
CTA::SST::CHEC::Logger::Logger(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in Logger.cc.o
"boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char>::consume(boost::log::v2_mt_posix::record_view const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
void boost::log::v2_mt_posix::sinks::basic_formatting_sink_frontend<char>::feed_record<boost::log::v2_mt_posix::aux::fake_mutex, boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char> >(boost::log::v2_mt_posix::record_view const&, boost::log::v2_mt_posix::aux::fake_mutex&, boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char>&) in Logger.cc.o
void boost::log::v2_mt_posix::sinks::basic_formatting_sink_frontend<char>::feed_record<boost::recursive_mutex, boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char> >(boost::log::v2_mt_posix::record_view const&, boost::recursive_mutex&, boost::log::v2_mt_posix::sinks::basic_text_ostream_backend<char>&) in Logger.cc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libCHEC.dylib] Error 1
make[1]: *** [CMakeFiles/CHEC.dir/all] Error 2
make: *** [all] Error 2
如您所見,我使用CMake,C ++ 11,Clang和Boost.Log構建此庫。 我在使用非常相似的軟件設置的OS X 10.9上沒有出現此錯誤。
在我的CMakeLists.txt,我說“BOOST_ALL_DYN_LINK”的定義,所以我不認為這是由Boost.Log命名空間問題就在這里解釋造成http://www.boost.org/doc/libs/1_54_0_beta1/libs/登錄/ DOC / HTML /日志/理/ namespace_mangling.html
find_package(Boost 1.5.5 COMPONENTS log thread system unit_test_framework REQUIRED)
ADD_DEFINITIONS(-DBOOST_ALL_DYN_LINK)
我在OS X 10.7和10.9上使用的軟件版本是
10.7
10.9
我發現OS X 10.7和10.9上的/opt/local/lib/libboost_log-mt.dylib中的符號名稱是不同的。 這似乎是我問題的根本原因。
10.7
$ nm -a /opt/local/lib/libboost_log-mt.dylib | grep put_integer
000000000004c1a0 T __ZN5boost3log11v2_mt_posix3aux11put_integerIcEEvRSbIT_St11char_traitsIS4_ESaIS4_EEjjS4_
000000000004c1a0 - 01 0000 FUN __ZN5boost3log11v2_mt_posix3aux11put_integerIcEEvRSbIT_St11char_traitsIS4_ESaIS4_EEjjS4_
000000000004c900 - 01 0000 FUN __ZN5boost3log11v2_mt_posix3aux11put_integerIwEEvRSbIT_St11char_traitsIS4_ESaIS4_EEjjS4_
000000000004c900 T __ZN5boost3log11v2_mt_posix3aux11put_integerIwEEvRSbIT_St11char_traitsIS4_ESaIS4_EEjjS4_
10.9
$ nm -a /opt/local/lib/libboost_log-mt.dylib | grep put_integer
0000000000048a00 - 01 0000 FUN __ZN5boost3log11v2_mt_posix3aux11put_integerIcEEvRNSt3__112basic_stringIT_NS4_11char_traitsIS6_EENS4_9allocatorIS6_EEEEjjS6_
0000000000048a00 T __ZN5boost3log11v2_mt_posix3aux11put_integerIcEEvRNSt3__112basic_stringIT_NS4_11char_traitsIS6_EENS4_9allocatorIS6_EEEEjjS6_
0000000000049000 - 01 0000 FUN __ZN5boost3log11v2_mt_posix3aux11put_integerIwEEvRNSt3__112basic_stringIT_NS4_11char_traitsIS6_EENS4_9allocatorIS6_EEEEjjS6_
0000000000049000 T __ZN5boost3log11v2_mt_posix3aux11put_integerIwEEvRNSt3__112basic_stringIT_NS4_11char_traitsIS6_EENS4_9allocatorIS6_EEEEjjS6_
有人可以幫我解決這個問題嗎?
較新版本的xcode默認使用-stdlib=libc++
來編譯所有內容,這意味着10.9上的boost會被這些標志編譯,這意味着所有內容都很愉快地鏈接。
我們可以通過c++filt
一個符號來驗證這一點,這顯示了10.9
編譯的boost:
$ c++filt __ZN5boost3log11v2_mt_posix3aux11put_integerIcEEvRNSt3__112basic_stringIT_NS4_11char_traitsIS6_EENS4_9allocatorIS6_EEEEjjS6_
void boost::log::v2_mt_posix::aux::put_integer<char>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, unsigned int, unsigned int, char)
std::__1::basic_string
是那里的詛咒證據。
但是,您在10.7
上使用boost的版本是使用libstdc++
編譯的,在這種情況下可以通過名稱修改來證明:
$ c++filt __ZN5boost3log11v2_mt_posix3aux11put_integerIcEEvRSbIT_St11char_traitsIS4_ESaIS4_EEjjS4_
void boost::log::v2_mt_posix::aux::put_integer<char>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int, unsigned int, char)
更簡單的std::basic_string
的存在告訴我們情況就是這樣。
這意味着當由MacPorts構建boost時,它是針對其他標准構建的。
一些解決方案是:1。編輯用於boost的portfile以使用-std=libc++
重新編譯它,以便它現在可以與其他代碼鏈接2.在編譯時使用-std=libstdc++
更改自己的代碼10.7而不是-std=libc++
3.編譯一個boost的私有副本,用於在10.7
上使用-std=libc++
構建的代碼。
所有這些都有優點和缺點。 如果用libc++
重建macports boost,那么任何使用它的東西也必須用libc++
編譯,這可能是一個無盡的地獄圈。
改變你自己的代碼可能是最簡單的,這意味着沒有增加版本和干擾portfiles,但如果你依賴libc++
提供的設施,你有點不走運。
構建boost的私有副本只意味着你遵循構建指令,當用b2
編譯它時,你添加: cxxflags=-stdlib=libc++
,這使得它使用該c++
庫構建,然后你鏈接到構建的副本從而不是MacPorts的副本。
我的訂單或偏好是私人提升,改變我的旗幟,futz與增強Portfile。
我使用以下選項構建了Boost 1.56,以強制它使用“-stdlib = libc ++”構建。
$ sudo ./b2 -j 4 --prefix=/usr/local link=shared threading=multi toolset=clang install -a cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++"
現在沒有出現鏈接問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.