代码之家  ›  专栏  ›  技术社区  ›  Chris Watts

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

  •  1
  • Chris Watts  · 技术社区  · 9 年前

    我想用 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随附 GLIBCXX_3.4.17 来自GCC 4.6.3-我已经检查了系统上的C++头文件,正如我所怀疑的,我需要的chrono库中的所有功能都在那里。那么为什么它要求3.4.19版本?

    我尝试用 sudo apt-get upgrade 希望能增加新的图书馆。这没有效果。此外,我会 真正地 喜欢能够在股票图像上运行。

    所以我尝试了静态链接 libstdc++ 具有 -static-libstdc++ 添加到我的LD标志。现在我显然失踪了 GLIBC-2.7 不能用相同的方式固定 -static-libgcc

    我没有主意了。

    2 回复  |  直到 9 年前
        1
  •  2
  •   Community CDub    7 年前

    通过执行中的步骤,我能够使用需要3.4.19的函数的先前版本进行编译 another answer .

    首先,我检查了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
  •  0
  •   Titonus    5 年前

    它可以执行“.symver”更改,但如果您使用>=编译它,它将打破std::chrono计时器和日期GCC 4.8,因为std::chrono ABI发生了变化。 它将与Ubuntu 12.04(GCC 4.6.3)等系统一起运行;时间将无法正确显示。