gpt4 book ai didi

c++ - 如何探测目标平台上系统版本的gcc使用的C++ ABI

转载 作者:IT王子 更新时间:2023-10-29 00:37:43 25 4
gpt4 key购买 nike

我有一个配置探测器,它根据平台和版本确定要传递给 g++ 的标志。我通常使用比 native 安装版本更高版本的 gcc,以便访问 C++14 功能。在较旧的平台上,这意味着我需要添加 -D_GLIBCXX_USE_CXX11_ABI=0 才能使用较旧的 C++ ABI,否则我无法链接到主机版本的 C++ 库。然而,一些较新的平台确实使用新的 ABI,在这种情况下,需要 -D_GLIBCXX_USE_CXX11_ABI=1(或什么都不需要)。

我可以根据目标平台的版本(即 lsb_release -a 的输出)来执行此操作,但我想要一种更通用的方法。

我想我已经完成了使用 native 编译器(与我后来的编译器相反)编译 C++ hello world 程序的一半,但我不太清楚如何探测 ABI 版本。例如

>strings hello | grep ABI.note.ABI-tag>strings hello | grep CXXGLIBCXX_3.4

或类似地在 hello probe 程序使用的 libstdc++ 版本上。

ldd ./hello | grep stdc++ | sed -e 's_.* /_/_' | cut -f 1 -d' ' |xargs strings | grep 

有没有人有更好的建议?

更新:事实上我根本不需要这样做。我真正的问题是我有一个旧版本的 libstdc++.so 闲逛。编译选择了一个版本 6.0.20,运行时选择了一个不兼容的版本 6.0.19(或​​者可能相反)。我有一个未解析的符号,我错误地将其归咎于 ABI 版本。与流行的看法相反,次要版本的 libstdc++ 并不总是二进制兼容的。我的意图是始终在运行和编译时使用完全相同的版本(如果不使用主机 native 版本)。

最佳答案

Contrary to popular belief minor versions of libstdc++ aren't always binary compatible.

它们不是双向二进制兼容的。当需要 libstdc++.so.6.0.19 时可以使用 libstdc++.so.6.0.20,反之则不行。

但是,在 GCC 5 之前,C++11 支持仍处于实验阶段(即正在进行中),因此新 C++11 组件的 ABI 不稳定,因此您不能混合使用 C++11/使用 GCC 4.x 和 GCC 4.y,或 GCC 4 和 GCC 5 编译的 C++14 代码。对于 C++98 代码,您可以自由混合和匹配(只需使用较新的 libstdc++.so 因为它只在一个方向上兼容)。

GCC 5 之前的主要 C++11 不兼容性的详细信息记录在 https://gcc.gnu.org/wiki/Cxx11AbiCompatibility 中。

无论如何,回答现在无关紧要的问题:

I think I'm half way there with compiling a C++ hello world program with the native compiler (as opposed to my later one) but I can't quite figure out how to probe the ABI version

如果你可以运行 native 编译器那么我看不出问题是什么,只需检查宏的默认值:

echo '#include <string>' | g++ -x c++ -E -dM - | fgrep _GLIBCXX_USE_CXX11_ABI

关于c++ - 如何探测目标平台上系统版本的gcc使用的C++ ABI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34764566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com