无法将 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) 等系统,但日期和时间将无法正确显示。
我正在尝试在我的应用程序中使用 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) 等系统,但日期和时间将无法正确显示。