C++11 Boost链接错误:';b5cx11';符号缺失

C++11 Boost链接错误:';b5cx11';符号缺失,c++11,boost,dynamic-linking,C++11,Boost,Dynamic Linking,问题是:我使用的代码使用了一个链接到boost的大型库。当我使用静态链接编译时,一切正常。然而,当我尝试动态链接时,我得到了一堆未定义的引用错误。第一个想法显然是“我没有链接boost程序选项”库,但我看了看,它就在linking命令中(在需要它的库之后)。然而,在不同的错误中,这一点尤为突出: undefined reference to `_ZN5boost15program_options3argB5cxx11E 根据我的日常经验,链接错误的形式通常是“未定义对某个函数的引用(…)”。因

问题是:我使用的代码使用了一个链接到boost的大型库。当我使用静态链接编译时,一切正常。然而,当我尝试动态链接时,我得到了一堆未定义的引用错误。第一个想法显然是“我没有链接boost程序选项”库,但我看了看,它就在linking命令中(在需要它的库之后)。然而,在不同的错误中,这一点尤为突出:

undefined reference to `_ZN5boost15program_options3argB5cxx11E
根据我的日常经验,链接错误的形式通常是“未定义对某个函数的引用(…)”。因此,我转到boost库的安装文件夹,使用
readelf
查看库
libboost\u程序中有哪些符号。事实上,这个符号并没有出现。相反,我找到的最接近的是
\u zn5boost15程序\u选项3arge

谷歌搜索了一下,我发现额外的部分
B5cxx11
是自C++11以来对mangling这个名称的新添加。看起来boost(至少版本1.59.0)还不支持这个新名称mangling

所以我的问题是:这是一个已知的问题吗?有什么解决办法?为什么静态链接不会出现这个问题


编辑:如果将来有人偶然发现这个问题,我只是尝试了boost 1.60.0,符号中包含字符串
b5cx11
。我相信这将解决这个问题。不过,作为再次检查,我将再次重新编译boost 1.59.0,看看这是否是由于我在环境中更改了某些内容(尽管我对此表示怀疑)。

不是boost必须支持它,而是编译器/链接器必须支持它。可能您的库是用C++11支持编译的,boost也是如此,但您当前的程序不是。如果您使用的是GCC,请尝试使用
--std=c++11
选项


或者可能是另一种情况,您正在C++11中实例化一个模板,该模板使用C++11名称混乱,在非C++11编译的boost中找不到库函数(尽管这可能会导致编译器错误)。

这个问题在许多月前就被问到了,但既然我已经登上了这一页,我将提出一个可能的解决方案


您可以尝试使用
-D\u GLIBCXX\u USE\u cx11\u ABI=0
标志编译代码,或定义此宏:
\define\u GLIBCXX\u USE\u cx11\u ABI 0
。有关更多详细信息,请参阅答案。

我最近遇到了类似的问题。我使用以下命令重新编译boost库

./b2 --build-dir=build/x86 address-model=32 threading=multi --toolset=gcc --layout=versioned --stagedir=./stage/x86 -j 8

./b2 --build-dir=build/x64 address-model=64 threading=multi --toolset=gcc --layout=versioned --stagedir=./stage/x64 -j 8
然后使用

g++ main.cpp -L/home/research/boost_library/boost_1_68_0/stage/x64/lib/ -lboost_program_options-gcc82-mt-x64-1_68

这解决了我的问题。我在redhat linux上使用gcc 8.2

可执行文件应使用
--std=c++11
编译,因为它使用了其中一些功能,我从未收到过投诉。此外,该标志应该已经通过cmake从链接库继承。但我会尝试显式添加它,看看会发生什么。呃,我检查过,我已经显式告诉cmake将该标志添加到现有的cxx标志中……你发现问题出在哪里了吗?