【问题标题】:Unable to use std::chrono with std::future - GLIBCXX_3.4.19 not found无法将 std::chrono 与 std::future 一起使用 - 未找到 GLIBCXX_3.4.19
【发布时间】:2015-09-15 03:29:30
【问题描述】:

我正在尝试在我的应用程序中使用std::future::wait_for(std::chrono::duration)(事实上,我根本不想等待,这会让这更加令人沮丧,正如您将看到的那样),但是在使用来自std::chrono 的任何东西时,在为我的 BeagleBone Black 交叉编译后,我无法运行该应用程序:

/usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.19' not found

在我将以下几行添加到我的代码之前,这个项目可以在旧版本的 GLIBCXX 上编译并运行良好,但是为了能够检查未来的值是否已准备好而不会阻塞,我突然需要所有这些较新的库:

if (myFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
    return true;

BeagleBone Black 带有来自 GCC 4.6.3 的 GLIBCXX_3.4.17 - 我已经检查了系统上的 C++ 头文件,并且正如我所怀疑的,我需要从 chrono 库中获得的所有功能都在那里。那么为什么它要求版本 3.4.19?

我尝试使用sudo apt-get upgrade 更新和升级 Debian,希望能够添加更新的库。这没有效果。此外,我真的希望能够在股票图像上运行。

所以我尝试静态链接 libstdc++-static-libstdc++ 添加到我的 LD 标志。现在我显然错过了GLIBC-2.7,它无法以与-static-libgcc 相同的方式修复

我没有想法。

【问题讨论】:

  • 也许尝试使用编译器标志-D _GLIBCXX_USE_CXX11_ABI=0 来选择前GCC 5 ABI? (GCC 5 引入了一个新的“可切换”二进制接口)。
  • 我按照您的建议尝试了编译器标志,但没有效果。

标签: c++ c++11 gcc cross-compiling dynamic-linking


【解决方案1】:

按照another answer 中的步骤,我能够使用需要 3.4.19 的以前版本的函数进行编译。

首先,我检查了从 3.4.19 开始需要什么:

$ objdump -T myapp | grep "GLIBCXX_3.4.19"
00000000      DF *UND*  00000000  GLIBCXX_3.4.19 _ZNSt6chrono3_V212system_clock3nowEv

然后我在我拥有的库中搜索了相同的符号

$ objdump -T /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep "_ZNSt6chrono3_V212system_clock3nowEv"

但这没有返回任何东西。凭直觉,我试着只找到“chrono”

$ objdump -T /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep "chrono"
00080828 g    DF .text  0000002a  GLIBCXX_3.4.11 _ZNSt6chrono12system_clock3nowEv
0008ae38 g    DO .rodata    00000001  GLIBCXX_3.4.11 _ZNSt6chrono12system_clock12is_monotonicE

宾果游戏。虽然不是完全匹配,但对我来说看起来已经足够好了。我在源文件中添加了一个汇编指令来更新请求符号的链接。

__asm__(".symver _ZNSt6chrono3_V212system_clock3nowEv,_ZNSt6chrono12system_clock3nowEv@GLIBCXX_3.4.11");

虽然它现在可以编译并运行,但我无法确定这种替换是否有效,因为我还有其他障碍要解决,但我认为我可以肯定地说这是一个解决方案。

【讨论】:

    【解决方案2】:

    它适用于“.symver”更改,但如果您使用 >= GCC 4.8 编译它,它将破坏您的 std::chrono 计时器和日期,因为 std::chrono ABI 发生了更改。 它将在 Ubuntu 12.04 (GCC 4.6.3) 等系统上运行,但日期和时间将无法正确显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2020-10-13
      • 2014-03-23
      • 1970-01-01
      • 2015-06-21
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多