提升正则表达式:链接

时间:2017-10-30 14:39:17

标签: c++ boost

直到几周前,使用 boost_regex 库,我使用以下命令编译C ++文件test.cpp

g++-4.9 -Wall -O3 -march=native -flto -DNDEBUG -o test \
 --std=c++14 test.cpp -lboost_regex -pthread

汇编工作正常。但在某些时候,我需要升级我的操作系统(更准确地说,它是Ubuntu 14.04,现在是Ubuntu 16.04)。

我使用我的数据保存了本地文件夹,并且再次在新系统中安装了Boost库,包括boost_regex。

新系统中的Boost版本是1.58,遗憾的是我之前无法知道我之前使用的Boost版本,因为它现在已被删除。

我尝试使用与上面相同的命令在新系统中再次编译相同的文件,链接器说它找不到两个函数,称为maybe_assign和{{1} }。如果我用construct_init替换-o test选项(即没有链接),那么程序编译时没有错误。

更确切地说,当我尝试进行链接时,我会收到以下错误(它们非常长,我希望缩短使用-c点数。)

...

我真的不知道这是怎么可能的,这些库似乎安装得很好,似乎没有什么遗漏,并且编译正在使用以前的操作系统安装(然后我想更老的库)。

在这一点上,我唯一的猜测可能是Boost作者删除了这些功能? (也许它们已经过时了?)。但我没有在互联网上找到任何这方面的痕迹。如果是这种情况,我怎么知道这些功能可用的提升版本

我有任何错误吗?您有任何建议可以调查此事吗?

1 个答案:

答案 0 :(得分:1)

TL; DR使用gcc5。

Ununtu 16.04默认配备gcc5。其中的每个C ++库都是用该编译器编译的。

现在gcc4和gcc5之间存在不兼容的C ++ ABI更改。它使得由C ++源构建的二进制文件与gcc4默认不兼容,并且使用gcc5构建了二进制文件。这种不兼容性通常表现为一堆引用std::string和/或std::list的未定义符号。

标准库内置双ABI,支持使用旧编译器构建的对象。像boost,hovever这样的其他库没有。