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

我使用 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'
141487 次浏览

有没有可能你正在使用海湾合作委员会5?

如果你得到未定义引用符号的链接器错误,这些引用涉及到 std: : _ _ cxx11命名空间或标签[ abi: cxx11]中的类型,那么它可能表明你正在尝试链接使用 _ GLIBCXX _ USE _ CXX11 _ ABI 宏的不同值编译的对象文件。这通常发生在链接到使用旧版本 GCC 编译的第三方库时。如果不能用新的 ABI 重新编译第三方库,那么您需要用旧的 ABI 重新编译代码。

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

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

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

- D _ GLIBCXX _ USE _ CXX11 _ ABI = 1

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

- D _ GLIBCXX _ USE _ CXX11 _ ABI = 0

定义

定义 _ GLIBCXX _ USE _ CXX11 _ ABI 0/1

也很好,但您可能需要将其添加到所有文件,而编译器选项为所有文件一次。

我得到了这个,我发现解决这个问题的唯一方法是更新所有的 Mingw-64(我这样做使用的是 msys2上的 pacman 为您提供信息)。

对我来说-D _ GLIBCXX _ USE _ CXX11 _ ABI = 0没有帮助。

它在我链接到 C + + libs 版本而不是 gnustl 之后工作。

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

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

    nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout

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

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

  • 比较你刚刚得到的库中的方法签名和你在代码中使用的方法签名(也检查头文件) ,如果它们不同,使用适当的头文件或者适当的库或者其他你现在知道的方法来修复它

当我遇到类似的问题时,就会发生这种情况,因为我的库是使用 clang++构建的,并且在我的系统中默认链接到 libstdc++.so。而应用程序二进制是建立使用 clang和链接与 -lc++选项。

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

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

  • 最简单的方法。使用 clang++构建库并使用 clang++编译应用程序。在两个步骤中都没有额外的链接选项。将使用默认的 stdlib。

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

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

最近我在 Ubuntu 16.04上尝试链接预先构建的 Hdf5版本1.10.5二进制文件时遇到了类似的问题。这里建议的解决方案都不适合我,我使用的是 g + + 版本9.1。我发现最好的解决方案是从源代码构建 hdf5库。不要使用预先构建的二进制文件,因为它们是使用 gcc4.9构建的!相反,从特定发行版的 hdf网站下载源代码归档并构建库。很简单。

如果系统上还没有压缩库,那么还需要分别来自 给你给你Zlib废话压缩库。

就我而言,我也遇到了类似的问题:

/usr/bin/ld: Bank.cpp:(.text+0x19c): undefined reference to 'Account::SetBank(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' collect2: error: ld returned 1 exit status

经过一些研究,我意识到这个问题是由 Visual Studio Code 编译 Bank.cpp 文件的方式产生的。所以,为了解决这个问题,我只是提示了 follow 命令,以便成功地编译 c + + 文件:

g++ Bank.cpp Account.cpp -o Bank

通过上面的命令,它能够正确地链接头文件、实现文件和主要的 c + + 文件。

OBS: My g + + version: 9.3.0 on Ubuntu 20.04

我也遇到过类似的问题

原来我的项目使用的是 gcc7和 g + + 9,并试图将这两个编译的对象文件链接在一起,结果一切都搞砸了。

确保在所有项目中使用相同的编译器版本。