是否有类似 -mcpu= 但用于 gcc 和 clang 中的操作系统选择的东西?还是“选择最匹配的最近目标”?

Posted

技术标签:

【中文标题】是否有类似 -mcpu= 但用于 gcc 和 clang 中的操作系统选择的东西?还是“选择最匹配的最近目标”?【英文标题】:Is there something like -mcpu= but for OS selection in both gcc and clang? Or a "choose the nearest target that best matches"? 【发布时间】:2014-09-29 03:37:00 【问题描述】:

简单问题:我知道-mcpu=xxx 可用于在 gcc 和 clang 上选择目标 CPU。除了目标操作系统,是否有等效的选项? -mos=linux-mos=freebsd 之类的东西?

或者,有没有办法可以指定一个不完整的目标三元组(例如,x86_64-*-freebsd*i686*linux*)并且 gcc/clang 会自动完成?

我问这个是因为 FreeBSD 和 OpenBSD 似乎使用特定于版本和特定于包管理器 (!) 的目标三元组。

谢谢。

编辑/更新我已经弄清楚了我需要的大部分内容,我唯一缺少的是:有没有办法指定要在 gcc 命令行上使用的目标,例如-target 切换到 clang?例如:gcc -someoptionhere i686-linux?或者知道我是否应该使用 multilib 目标而不是目标三元组的方法? :S 谢谢...

【问题讨论】:

没有。操作系统是构建 gcc 的“目标”的一部分(即i486-linux-gnu)。如果您需要不同的目标,则需要不同的 gcc 版本。 对,现在我明白gcc 本身实际上并不是一个通用前端。谢谢。 【参考方案1】:

好吧,这是我自己想出来的(参考在底部)。

-m实际上是为multilib编译器指定一个目标。

对于 clang,可以使用 -target 选项指定目标三元组。三元组的任何部分都可以省略;将改为选择适当的默认值。所以我真正需要说的是[arch]-[OS][arch]-[OS]-[ABI]。版本号并不重要,请参阅 LLVM 源代码中的 include/llvm/ADT/Triple.h。

不幸的是,与我最初认为的相反,gcc不是这样工作:每个单独的 gcc 构建都与给定的目标三元组相关联,而不合格的 gcc 通常硬链接到给定目标三元组。这意味着我不能像使用 clang 那样使用任何快捷方式;需要指定目标三元组。

所以现在我需要弄清楚如何使用 gcc 和 clang 以及相同的工具/构建脚本(不是 configure、cmake 或 scons)来支持交叉编译。谢谢!

参考资料:

https://gcc.gnu.org/install/specific.html https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Target-Options.html https://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Target-Options.html https://***.com/a/4455746/3408572 http://clang.llvm.org/docs/CrossCompilation.html http://wiki.osdev.org/Target_Triplet irc.freenode.net/#gcc 中的 redi irc.oftc.net/#llvm 中的 jroelofs

【讨论】:

以上是关于是否有类似 -mcpu= 但用于 gcc 和 clang 中的操作系统选择的东西?还是“选择最匹配的最近目标”?的主要内容,如果未能解决你的问题,请参考以下文章

函数调用中数组分配的差异(gcc和cl.exe)

是否有类似 next_permutation 的函数,但用于重复排列?

有没有办法在 GCC 或 cl.exe 的预处理和编译之间插入一个步骤?

GCC 的调试堆/STL 调试等效项?

序列化二进制结构 gcc vs cl

strcpy_s 不适用于 gcc