【问题标题】:Linking with library causes collate facet to be missing from char与库链接会导致 char 缺少整理方面
【发布时间】:2017-07-11 14:15:18
【问题描述】:

我有一个使用 std::regex 的 C++14 应用程序。对于某些正则表达式,如果 collat​​e facet 不可用,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构造函数抛出。

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

我该如何解决这个问题?

【问题讨论】:

    标签: c++14 ld glibc


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我最近遇到了同样的问题。在我的情况下,发生这种行为是因为我使用 不同版本的 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 like 的可用性

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 2020-02-17
        • 2016-06-21
        • 2023-03-26
        相关资源
        最近更新 更多