微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在目标平台上探测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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐