提升链接错误:'B5cxx11'符号丢失

时间:2016-02-22 19:53:57

标签: c++11 boost dynamic-linking

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

undefined reference to `_ZN5boost15program_options3argB5cxx11E

在我的日常经验中,链接错误通常是“对某些功能(...)的未定义引用”。所以我转到了我的boost库的安装文件夹,并使用readelf查看我在库libboost_program.so中有哪些符号。事实上,这个符号并没有出现。相反,我找到的最接近的是_ZN5boost15program_options3argE

Google-ing,我发现额外的部分B5cxx11是自C ++ 11以来名称修改的新增内容。似乎boost(至少版本1.59.0)还不支持这个新名称。

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

编辑:如果将来有人偶然发现这个问题,我只是尝试升级1.60.0,符号包含字符串B5cxx11。我相信(读:希望)这将解决问题。但是,作为一个双重检查,我将再次重新编译提升1.59.0,看看这是否是由于我在我的环境中发生的变化(尽管我对此表示怀疑)。

3 个答案:

答案 0 :(得分:0)

这不是boost必须支持它,你的编译器/链接器有。可能你的库是用C ++ 11支持编译的,所以你的提升,但你当前的程序不是。如果您在GCC,请尝试使用HTree选项。

或者也许是反过来了,你在C ++ 11中实例化一个模板,它使用C ++ 11名称修改,并且在非C ++ 11编译的提升中找不到库函数(虽然这会与编译器错误有关)。

答案 1 :(得分:0)

这个问题在很多个月前被问过,但由于我已经登陆这个页面,我将提出一个可能的解决方案。

您可以尝试使用-D_GLIBCXX_USE_CXX11_ABI=0标记编译代码或定义此宏:#define _GLIBCXX_USE_CXX11_ABI 0。有关详细信息,请参阅this question的答案。

答案 2 :(得分: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

相关问题