我試圖鏈接使用Boost的第三方庫。我已經鏈接到正確的提升庫(libboost_program_options.a),但仍未找到它。未定義的升壓參考
誤差MSG(格式化的位爲清楚起見):
undefined reference to `boost::program_options::validate(boost::any&,
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&,
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*,
int)'
納米--demangle libboost_program_options.a | grep validate
boost::program_options::validate(boost::any&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&,
bool*,
int)
boost::program_options::validate(boost::any&,
std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&,
std::string*,
int)
boost::program_options::validate(boost::any&,
std::vector<std::string, std::allocator<std::string> > const&,
bool*,
int)
boost::program_options::validate(boost::any&,
std::vector<std::string, std::allocator<std::string> > const&,
std::string*,
int)
第二條記錄看起來很相似,但顯然不夠接近。任何想法如何編譯Boost來獲得與庫中的內容相匹配的簽名?我向圖書館的所有者請求瞭解他們正在使用的Boost版本等,但還沒有收到回覆。
這是一個CentOS 7盒子,它使用g ++版本4.8.5。但我嘗試鏈接的庫大量使用C++ 11,並使用g ++ v 6.1編譯,所以我安裝了devtoolset-6,它給了我一個g ++ 6環境(g ++版本6.3.1)
我下載了並從頭開始構建Boost(v1.65.1),以便使用相同的編譯器構建而不是系統版本。
編輯... 我認爲約翰Zwinck是在正確的軌道上,但我無法得到增強庫編譯到新的ABI。
的驗證()函數在value_semantic.cpp
剝離構建下的基本知識發現,並添加標誌討論:
g++ -std=c++11 -D_GLIBCXX_USE_CXX11_ABI -c -o test.o libs/program_options/src/value_semantic.cpp
nm --demangle test.o | grep validate
00000000000008b6 T boost::program_options::validate(boost::any&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, bool*, int)
0000000000000c02 T boost::program_options::validate(boost::any&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, std::string*, int)
00000000000005f2 T boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, bool*, int)
0000000000000b9a T boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, std::string*, int)
是否_GLIBCXX_USE_CXX11_ABI宏只適用於GCC 5.1的工作?
您是否嘗試過使用'g ++ -std = C++ 11'來構建boost? – burlyearly
不 - 據我所知,C++ 11是g ++ v6的默認設置。不過,我正在考慮這個問題 - 必須看看如何將它融入Boost構建系統。 – CoAstroGeek
剛剛看過C++ 14是gcc v6的默認版本 https://gcc.gnu.org/projects/cxx-status.html#cxx11 – CoAstroGeek