gpt4 book ai didi

architecture - 如何使用CMake检测目标架构?

转载 作者:行者123 更新时间:2023-12-03 06:38:16 27 4
gpt4 key购买 nike

我已经做了很多研究,但无法找到这个问题的答案...我如何使用 CMake 可靠地找到我正在编译的目标架构?基本上相当于qmake中的QMAKE_TARGET.arch。

大多数来源似乎都建议使用 CMAKE_SYSTEM_PROCESSOR,但这是一个糟糕的解决方案,因为例如,无论您是针对 i386、x86_64、ppc 还是 ppc64 进行编译,它总是会在 OS X 上返回 i386。

同样,CMAKE_SIZEOF_VOID_P 给出系统的指针大小,而不是目标的指针大小。

我知道有 CMAKE_OSX_ARCHITECTURES,但如果未设置,它可能为空,在这种情况下,它似乎默认为系统能够执行的任何操作。那么如何才能找到目标架构信息呢?

特别是对于 OS X,我如何区分 32、64 和 Intel Universal?

最佳答案

因此,我为我的问题设计了一个相当有创意的解决方案...看来 CMake 没有检测目标架构的功能。

现在,我们知道我们可以在 C 中轻松地做到这一点,因为像 __i386____x86_64__ 等符号将根据您的环境进行定义。幸运的是,CMake 有一个 try_run 函数,可以在配置阶段编译并运行任意 C 源代码文件。

然后我们可以编写一个小程序,它使用一堆 ifdef 并将架构名称作为字符串写入控制台。唯一的问题是,这仅在主机和目标系统相同的情况下才有效...它在交叉编译期间无法工作,因为虽然您可以编译二进制文件,但无法运行它来查看其输出。

这就是事情变得有趣的地方。我们可以通过故意编写一个损坏的 C 程序来利用 C 预处理器来获取必要的信息...我们使用基于 ifdef 将架构名称写入控制台的原始概念,但我们不这样做,而是简单地放置一个 #错误预处理器指令代替 printf 调用。

当 CMake 的 try_run 函数编译 C 文件时,编译总是会失败,但是我们在 #error 指令中放置的任何消息都会显示在编译器的错误输出中,try_run 返回给我们。

因此,我们所要做的就是使用一些 CMake 字符串命令从编译器的错误输出中解析架构名称,并且我们可以检索目标架构......即使在交叉编译时也是如此。

代码的 OS X 特定部分主要使用 CMAKE_OSX_ARCHITECTURES 来确定目标体系结构,但在未指定的情况下,它将使用与其他系统相同的代码并正确返回 x86_64(对于编译器默认的现代系统) )或 i386(适用于较旧的 OS X 系统,例如 Leopard)。

我已经使用 Visual Studio 9 和 10 生成器(x86、x86_64、ia64)、Xcode、NMake、MSYS Makefiles 和 Unix Makefiles 在 Windows、OS X 和 Linux 上测试并验证了它的工作原理。每次都返回正确的结果。

注意:如果您故意执行诸如将 -m32 或 -m64 传递给编译器之类的操作,或其他可能影响目标体系结构的标志(是否有一种方法可以传递所有环境),则此解决方案可能会失败设置到 try_run?);这不是我测试过的东西。只要您使用生成器的默认设置并且所有目标都针对相同的架构进行编译,您应该没问题。

我的解决方案的完整源代码可以在 GitHub 上找到:https://github.com/petroules/solar-cmake/blob/master/TargetArch.cmake

关于architecture - 如何使用CMake检测目标架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11944060/

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