将std :: __ cxx11 :: string转换为std :: string

jor*_*gen 66 c++ string types std c++11

我使用的是c ++ 11,还有一些没有为它配置的库,需要一些类型转换.特别是我需要一种方法转换std::__cxx11::string为常规std::string,但谷歌搜索我找不到一种方法来做到这一点,并放在(string)前面是行不通的.

如果我不转换,我会得到这样的链接器错误:

undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const'
Run Code Online (Sandbox Code Playgroud)

Mat*_*ndl 89

你有可能使用GCC 5吗?

如果您收到有关涉及std :: __ cxx11命名空间中的类型或标签[abi:cxx11]的符号的未定义引用的链接器错误,那么它可能表示您正在尝试将使用不同值编译的目标文件链接在一起_GLIBCXX_USE_CXX11_ABI宏.当链接到使用旧版GCC编译的第三方库时,通常会发生这种情况.如果无法使用新的ABI重建第三方库,则需要使用旧的ABI重新编译代码.

资料来源:GCC 5发行说明/双ABI

包含任何标准库头之前定义以下宏应该可以解决您的问题:#define _GLIBCXX_USE_CXX11_ABI 0

  • 我试过这个; 现在我在使用c ++ 11函数的任何地方都遇到链接器错误.也许没有办法使用c ++ 11和编译的hdf5库. (4认同)

小智 48

如果您可以重新编译您使用的所有不兼容的库,请使用编译器选项

-D_GLIBCXX_USE_CXX11_ABI = 1

然后重建您的项目.如果您不能这样做,请添加到项目的makefile编译器选项中

-D_GLIBCXX_USE_CXX11_ABI = 0

定义

#define _GLIBCXX_USE_CXX11_ABI 0/1

也很好,但你可能需要将它添加到你的所有文件,而编译器选项一次为所有文件.

  • 编译器标志为我工作。谢谢。我为gcc的这一愚蠢更改浪费了4天! (3认同)

Evg*_*nov 6

当我遇到类似问题时,这是因为我的库是使用 构建的clang++,并且libstdc++.so默认情况下它在我的系统上链接。虽然应用程序二进制文件是使用选项构建clang并链接的-lc++

检查依赖关系的最简单方法是执行 ldd libName.so

要修复它,您应该在应用程序和库中使用相同的库。

  • 最简单的方法。使用构建库clang++并使用clang++. 两个步骤都没有额外的链接选项。将使用默认标准库。

  • 构建库-stdlib=c++,并编译应用程序-lc++。在这种情况下,库和应用程序都将使用libc++.so.

  • 无需额外选项即可构建库并将二进制文件链接到-lstdc++. 在这种情况下,库和应用程序都将使用libstdc++.so.


rig*_*717 5

这里的答案主要集中在修复它的简短方法,但如果这没有帮助,我将给出一些步骤来检查,这对我有帮助(仅限 Linux):

  • 如果链接其他库时发生链接器错误,请使用调试符号(“-g”GCC 标志)构建这些库
  • 列出库中的符号并 grep 链接器抱怨的符号(在命令行中输入命令):

    nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout

  • 如果您获得了方法签名,请继续下一步,如果您获得了方法签名no symbols,则很可能您从库中删除了所有符号,这就是链接器在链接库时找不到它们的原因。重建库而不删除所有符号,strip -S如果需要,您可以删除调试(选项)符号。

  • 使用c++ demangler来理解方法签名,例如这个

  • 将您刚刚获得的库中的方法签名与您在代码中使用的方法签名进行比较(同时检查头文件),如果它们不同,请使用正确的标头或正确的库或您现在知道的任何其他方法来修复它