G++ 新的 ABI 问题



我在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传递给海湾合作委员会,
  • 直接在源代码中设置宏,
  • 在传递-Wabi-tag标志时在 GCC 抱怨的声明上设置 abi_tag 属性,

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

我的问题有什么明显的解决方案吗,我错过了?

此错误

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

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

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

最新更新