无法将 std::chrono 与 std::future 一起使用 - GLIBCXX_3.4.19 未找到

Unable to use std::chrono with std::future - GLIBCXX_3.4.19 not found

我正在尝试在我的应用程序中使用 std::future::wait_for(std::chrono::duration)(事实上,我根本不想等待,这让这更令人沮丧,正如您所看到的),但是在使用来自std::chrono,我无法 运行 我的 BeagleBone Black cross-compiling 之后的应用程序:

/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++ headers,正如我所怀疑的,我需要的所有功能都来自 chrono 库有没有。那么为什么它要求版本 3.4.19?

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

所以我尝试静态链接 libstdc++-static-libstdc++ 添加到我的 LD 标志。现在我显然缺少 GLIBC-2.7 无法以与 -static-libgcc

相同的方式修复

我没主意了。

我能够按照 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");

虽然它现在可以编译和运行,但我不能肯定地说这个替代有效,因为我还有其他障碍需要解决,但我认为我可以安全地说这是一个解决方案。

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