如何在目标平台

时间:2016-01-13 10:44:14

标签: c++ linux gcc c++14 configure

我有一个配置探针,可以根据平台和版本确定要传递给g ++的标志。我通常使用更高版本的gcc而不是本机安装版本,以便获得对C ++ 14功能的访问。 在较旧的平台上,这意味着我需要添加-D_GLIBCXX_USE_CXX11_ABI = 0以使用旧的C ++ ABI,或者我无法与主机版本的C ++库链接。 但是,一些较新的平台确实使用新的ABI,在这种情况下,需要-D_GLIBCXX_USE_CXX11_ABI = 1(或者根本不需要)。

我可以根据目标平台的版本(即lsb_release -a的输出)来做到这一点,但我想要一个更通用的方法。

我认为我已经完成了使用本机编译器编译C ++ hello world程序的一半(而不是后来的编译器),但我无法弄清楚如何探测ABI版本。 E.g。

>strings hello | grep ABI
.note.ABI-tag
>strings hello | grep CXX
GLIBCXX_3.4

或类似于hello探针程序使用的libstdc ++版本。

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

有没有人有更好的建议?

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

1 个答案:

答案 0 :(得分:2)

  

与流行的看法相反,libstdc ++的次要版本并不总是二进制兼容。

它们在两个方向上都不是二进制兼容的。 libstdc ++。so.6.0.20可以在libstdc ++。so.6.0.19中使用,但不是相反。

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

https://gcc.gnu.org/wiki/Cxx11AbiCompatibility

中记录了GCC 5之前主要的C ++ 11不兼容性的详细信息。

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

  

我想我已经用原生编译器编译C ++ hello world程序了一半(而不是我后来的编译器)但是我无法弄清楚如何探测ABI版本

如果您可以运行本机编译器,那么我不知道问题是什么,只需检查宏的默认值:

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