提问人:Maelkum 提问时间:1/24/2016 更新时间:1/24/2016 访问量:5243
G++ 新 ABI 问题
G++ new ABI problems
问:
我在 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
我的问题有什么明显的解决方案吗?
答:
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 clean
make recompile
.o
0赞
Georg
5/15/2016
我想知道你的最终解决方案是什么。您是否必须手动将 abi 标签添加到任何类或方法中?我想知道旧代码是否可以像以前一样编译(在不生成任何错误的情况下破坏 abi)
0赞
Maelkum
6/28/2016
@Georg 对不起,回答太晚了。我不需要做任何事情,只需完全重新编译。事实证明,我的 Makefile(手动编写)中有一个错误,它正在删除所有文件;所以我混合了使用旧 ABI 和新 ABI 编译的文件。事实证明,这并不神秘,真的。旧代码“可以像以前一样编译”,而不会破坏 ABI。.o
评论