链接库会导致char

时间:2017-02-21 19:20:06

标签: c++14 ld glibc

我有一个使用std::regex的C ++ 14应用程序。对于某些正则表达式,如果整理方面不可用,std::regex构造函数将抛出std::bad_cast(通过std::use_facet)。

我想将我的应用程序与作为.so分发的第三方库链接,我没有源代码。这个库为glibc所需的一切提供了默认的符号版本。它指定的版本是2.2.5(2002年发布)。例如,nm告诉我:

U setlocale@@GLIBC_2.2.5

如果我在没有第三方库的情况下链接我的应用程序,正则表达式可以正常工作。但是当我与第三方库链接时,std::has_facet<std::collate<char>>(std::locale())返回false,因此std::regex构造函数会抛出。

我的猜测是,第三方库所需的旧符号版本正在干扰默认语言环境。我尝试在我的应用程序中更改默认语言环境,但这没有帮助。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

更新到使用较新编译器构建的第三方库版本会导致问题消失。

答案 1 :(得分:0)

我最近遇到了同样的问题。在我的情况下,行为发生是因为我使用不同版本的GCC 来编译库和可执行文件。以下是我将GCC 4.7和GCC 5.5结合起来编译库和可执行文件的结果:

  • 图书馆(GCC 4.7)+可执行文件(GCC 5.5)=失败:整理缺失
  • 图书馆( GCC 4.7 )+可执行文件( GCC 4.7 )= 成功:整理可用
  • 图书馆( GCC 5.5 )+可执行文件( GCC 5.5 )= 成功:整理可用

测试基于检查char collat​​e的可用性,如

std::has_facet<std::collate<char>>(std::locale())