我正在尝试链接到使用 Boost 的第 3 方库。我已经链接到正确的 boost 库 (libboost_program_options.a),但仍然没有找到它。
错误消息(为清楚起见,进行了一些格式化):
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)'
nm --demangle libboost_program_options.a | grep 验证
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 版本等,但尚未收到回复。
这是在使用 g++ 4.8.5 版的 CentOS 7 机器上。但是我试图链接的库大量使用 C++11,并且是用 g++ v 6.1 编译的,所以我安装了 devtoolset-6,它为我提供了一个 g++ 6 环境(g++ 版本 6.3.1)
我从头开始下载并构建了 Boost (v1.65.1),因此它是使用相同的编译器构建的,而不是系统版本。
编辑...我认为 John Zwinck 走在正确的轨道上,但我无法让 boost 库编译到新的 ABI。
validate() 函数位于 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?