无法使用std :: chrono与std :: future - 找不到GLIBCXX_3.4.19

问题描述 投票:1回答:2

我正在尝试在我的应用程序中使用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++和添加到我的LD标志的-static-libstdc++。现在我显然缺少GLIBC-2.7,无法用-static-libgcc以同样的方式修复

我没有想法。

c++ c++11 gcc cross-compiling dynamic-linking
2个回答
2
投票

我能够通过以下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");

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


0
投票

它运行“.symver”更改,但是如果用> = GCC 4.8编译它会破坏你的std :: chrono定时器和日期,因为std :: chrono ABI有变化。它将与Ubuntu 12.04(GCC 4.6.3)等系统一起运行,但日期和时间将无法正确显示。

© www.soinside.com 2019 - 2024. All rights reserved.