首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将std::__cxx11::string转换为std::string

将std::__cxx11::string转换为std::string
EN

Stack Overflow用户
提问于 2015-10-28 15:19:41
回答 9查看 141.2K关注 0票数 83

我使用c++11,但也使用一些未为其配置的库,并且需要进行某种类型转换。特别是,我需要一种将std::__cxx11::string转换为常规std::string的方法,但谷歌搜索无法找到这样做的方法,并且将(string)放在前面是行不通的。

如果不进行转换,就会得到如下链接器错误:

代码语言:javascript
复制
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'
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2015-10-28 15:44:03

你有可能在用GCC 5吗?

如果您收到关于涉及std::__cxx11命名空间中类型或标记abi:cxx11 11的符号的未定义引用的链接器错误,那么它可能表明您试图将使用_GLIBCXX_USE_CXX11_ABI宏不同值编译的对象文件链接到一起。这种情况通常发生在链接到第三方库时,后者是用较旧版本的GCC编译的。如果第三方库不能用新的ABI重新构建,那么您就需要用旧的ABI重新编译代码。

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

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

票数 120
EN

Stack Overflow用户

发布于 2016-05-27 08:12:10

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

-D_GLIBCXX_USE_CXX11_ABI=1

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

-D_GLIBCXX_USE_CXX11_ABI=0

定义

#定义_GLIBCXX_USE_CXX11_ABI 0/1

也很好,但是您可能需要将它添加到所有文件中,而编译器选项则需要一次对所有文件执行它。

票数 57
EN

Stack Overflow用户

发布于 2019-07-30 10:11:54

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

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

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

  • 最简单的方法。使用clang++构建库,用clang++编译应用程序。两个步骤都没有额外的链接选项。将使用默认的stdlib。
  • -stdlib=c++构建库,用-lc++编译应用程序。在这种情况下,库和应用程序都将使用libc++.so
  • 构建没有额外选项的库,并将二进制链接到-lstdc++。在这种情况下,库和应用程序都将使用libstdc++.so
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33394934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档