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

如何在目标平台上探测gcc的系统版本所使用的C ++ ABI,第1张

概述如何在目标平台上探测gcc的系统版本所使用的C ++ ABI

我有一个configuration探测,确定什么标志传递给基于平台和版本的g ++。 我通常使用比本机安装版本更高版本的gcc来访问C ++ 14function。 在较旧的平台上,这意味着我需要添加-D_GliBCXX_USE_CXX11_ABI = 0来使用较旧的C ++ ABI,否则我无法链接主机版本的C ++库。 但是,一些较新的平台使用新的ABI,在这种情况下,-D_GliBCXX_USE_CXX11_ABI = 1(或根本不需要)。

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

我想我是用本地编译器编译C ++ hello world程序的一半(而不是我后来的版本),但是我不太清楚如何探测ABI版本。 例如

>stringhello | grep ABI

.note.ABI标签

>stringhello | grep CXX

GliBCXX_3.4

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

如何在一个进程中接受SSL连接,并在另一个进程中重用相同的SSL上下文

在释放模式下检测到缓冲区溢出 – linux

查找在POSIX信号量上阻塞的任务数量

我怎样才能添加一个WPF覆盖在一个外部的Win32应用程序的窗口?

WP8networking状态 – 应用程序崩溃,当它没有networking

ldd ./hello | grep stdc ++ | sed -e's _。* / _ / _'| cut -f 1 -d''| xargsstring| grep的

有没有人有更好的build议?

更新:其实我根本不需要这样做。 我真正的问题是我有一个老版本的libstdc ++。 汇编select了一个版本6.0.20和运行时select了一个不兼容的6.0.19(或​​可能反之亦然)。 我有一个未解决的符号,我错误地指责了ABI版本。 与stream行的观点相反,小版本的libstdc ++并不总是二进制兼容的。 我的意图是始终在运行和编译时使用完全相同的版本(如果不使用主机本地版本)。

我应该如何防止硬链接攻击?

deBUGging – 是否有windowsdeBUGging器的检查点function?

windows 10(现代)通用应用程序平台(UWP)messageBox

windows中的C ++高精度时间测量

是perror线程安全的?

与流行的观点相反,小版本的libstdc ++并不总是二进制兼容的。

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

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

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

无论如何,要回答这个无关紧要的问题:

我想我是用本地编译器编译C ++ hello world程序的一半(而不是我后来的版本),但是我不太清楚如何探测ABI版本

如果你可以运行本地编译器,那么我不会看到问题是什么,只要检查宏的默认值:

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

总结

以上是内存溢出为你收集整理的如何在目标平台上探测gcc的系统版本所使用的C ++ ABI全部内容,希望文章能够帮你解决如何在目标平台上探测gcc的系统版本所使用的C ++ ABI所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1266265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存