gpt4 book ai didi

c++ - 未定义的 boost 引用

转载 作者:行者123 更新时间:2023-11-30 02:22:22 26 4
gpt4 key购买 nike

我正在尝试链接到使用 Boost 的第三方库。我已链接到正确的 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 | 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 等,但尚未收到回复。

这是在 CentOS 7 机器上,它使用 g++ 版本 4.8.5。但是我尝试链接的库大量使用 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 吗?

最佳答案

您似乎与 C++11 中的 std::string 的 GCC Dual ABI 发生冲突:https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

您的程序正在尝试使用

链接 API
std::__cxx11::basic_string<char>* 

但是你的 Boost 库有

std::basic_string<char>*

这意味着您的 Boost 库是使用 5.1 之前版本的 GCC 构建的,或者关闭了新的 ABI。无论哪种情况,您都可以通过添加以下编译器标志来编译自己的代码,并关闭新的 ABI:

-D_GLIBCXX_USE_CXX11_ABI=0

通过用它编译你的程序,就可以使用系统提供的(旧的 ABI)Boost 库。但接下来的问题是您的供应商使用哪种 C++ ABI 编译了他们的代码(询问他们,或者在他们的库中查找 __cxx11)。

关于c++ - 未定义的 boost 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com