【问题标题】:G++ new ABI problemsG++ 新的 ABI 问题
【发布时间】:2018-03-22 08:26:28
【问题描述】:

我在 GCC 中为 C++11 引入的新 ABI 遇到了问题。升级到 GCC 5.3 后,我的项目不再编译。我得到的错误信息很简单:

undefined reference to `tokenize(std::__cxx11::basic_string'  ...more characters

undefined reference to `extract(std::string const&)'

所以,看起来我搞砸了,GCC 无法决定我想要旧 ABI 还是新 ABI(__cxx11:: 部分在一些错误消息中丢失,而在其他消息中出现)?

我尝试了几种解决方案来解决这个问题:

  • -D_GLIBCXX_USE_CXX11_ABI=0 传递给 GCC,
  • -D_GLIBCXX_USE_CXX11_ABI=1 传递给 GCC,
  • 直接在源代码中设置宏,
  • 在传递 -Wabi-tag 标志时,在 GCC 抱怨的声明中设置 abi_tag 属性,

不幸的是,它们都不起作用(即允许代码编译)。我知道的一件事是,只有返回 std::string 或将其作为参数的函数才能链接。鉴于我在互联网上读到的有关该问题的信息,这是可以预料的。我无法在一个简单的示例程序中重现该问题,以便在此处展示。

我的问题有什么明显的解决方案吗?

【问题讨论】:

  • 这是一个链接器错误,而不是编译器错误。这表明您尝试链接的编译对象和库是使用不同的 ABI 编译的。
  • @rici 是的,你是对的。我知道问题发生在链接期间。但是,是编译器发出要链接的代码(或者我的理解不足?)。我不知道的是为什么 G++ 有时使用新的,有时使用旧的 ABI 发出代码,即使我正在对代码进行完全重新编译。

标签: c++ c++11 gcc


【解决方案1】:

此错误表明您正在链接的代码或库尚未由 gcc 5.3 重新编译,而是由早期版本的 gcc 使用早期版本的 ABI 编译的。

如果您要链接一些外部库,除了标准 C++ 库之外,还需要重新编译(并重新安装)这些外部库。

如果您没有与任何外部库链接,而只是将您自己的代码链接在一起,那么您的某些源模块一定还没有被重新编译。重新编译一切。确保使用 make clean 或您正在使用的任何构建系统的等效项擦除所有现有对象模块。

【讨论】:

  • 我只链接我自己的代码。我还有make clean'd 和make recompile'd。原来我的Makefile 中一定有一个错误。在我手动删除所有 .o 文件后,我得到了一个漂亮、干净、通过测试的构建。我接受你的回答。谢谢!
  • 我想知道您的最终解决方案是什么。您是否必须手动将 abi-tags 添加到任何类或方法中?我想知道旧代码是否可以像以前一样编译(打破 abi 而不会产生任何错误)
  • @Georg 抱歉非常迟到了答案。我不需要做任何事情,只需完全重新编译。原来我的 Makefile 中有一个错误(手写),它正在删除所有 .o 文件;所以我混合了使用旧 ABI 和新 ABI 编译的文件。事实证明,这并不是什么神秘的事情,真的。旧代码“可以像以前一样编译”而不会破坏 ABI。
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 2012-07-25
  • 1970-01-01
  • 2011-09-07
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多