我有一个使用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
构造函数会抛出。
我的猜测是,第三方库所需的旧符号版本正在干扰默认语言环境。我尝试在我的应用程序中更改默认语言环境,但这没有帮助。
我该如何解决这个问题?
答案 0 :(得分:1)
更新到使用较新编译器构建的第三方库版本会导致问题消失。
答案 1 :(得分:0)
我最近遇到了同样的问题。在我的情况下,行为发生是因为我使用不同版本的GCC 来编译库和可执行文件。以下是我将GCC 4.7和GCC 5.5结合起来编译库和可执行文件的结果:
测试基于检查char collate的可用性,如
std::has_facet<std::collate<char>>(std::locale())