G++ 新 ABI 问题

G++ new ABI problems

提问人:Maelkum 提问时间:1/24/2016 更新时间:1/24/2016 访问量:5243

问:

我在 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 还是新的(该部分在某些错误消息中丢失,而在其他错误消息中出现)?__cxx11::

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

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

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

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

C++ C++11 GCC

评论

2赞 rici 1/24/2016
这是链接器错误,而不是编译器错误。它表明您尝试链接的已编译对象和库是使用不同的 ABI 编译的。
1赞 Maelkum 1/24/2016
@rici 是的,你是对的。我知道在链接过程中会出现问题。但是,是编译器发出要链接的代码(或者我缺乏理解?我不知道的是,为什么 G++ 有时会使用新的 ABI,有时使用旧的 ABI 发出代码,即使我正在对代码进行完全重新编译。

答:

9赞 Sam Varshavchik 1/24/2016 #1

此错误表示您链接到的某些代码或库尚未由 gcc 5.3 重新编译,并且由早期版本的 gcc 使用早期版本的 ABI 编译。

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

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

评论

0赞 Maelkum 1/24/2016
我只链接我自己的代码。我还'd和'd.Resultsofof我的Makefile中一定有一个错误。在我手动删除所有文件后,我得到了一个漂亮、干净、通过测试的构建。我接受你的回答。谢谢!make cleanmake recompile.o
0赞 Georg 5/15/2016
我想知道你的最终解决方案是什么。您是否必须手动将 abi 标签添加到任何类或方法中?我想知道旧代码是否可以像以前一样编译(在不生成任何错误的情况下破坏 abi)
0赞 Maelkum 6/28/2016
@Georg 对不起,回答晚了。我不需要做任何事情,只需完全重新编译。事实证明,我的 Makefile(手动编写)中有一个错误,它正在删除所有文件;所以我混合了使用旧 ABI 和新 ABI 编译的文件。事实证明,这并不神秘,真的。旧代码“可以像以前一样编译”,而不会破坏 ABI。.o