无法对std::future使用std::chrono - GLIBCXX_3.4.19未找到

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

本文关键字:std future 使用 chrono GLIBCXX      更新时间:2023-10-16

我试图在我的应用程序中使用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上编译和运行得很好,但只是为了能够检查future的值是否准备好而不阻塞,我突然需要所有这些新库:

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

修复I'm out of ideas.

我能够按照另一个答案中的步骤编译需要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");

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

但是如果你用>= GCC 4.8编译它,它会破坏你的std::chrono计时器和日期,因为std::chrono ABI有变化。它可以在Ubuntu 12.04 (GCC 4.6.3)等系统上运行,但是日期&时间将无法正确显示