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

2024-02-12

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

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

类似地,CMAKE_SIZEOF_VOID_P 给出了指针的大小system,不是目标。

我知道有 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 上测试并验证了它的工作原理。每次都会返回正确的结果。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用CMake检测目标架构? 的相关文章

  • 如何使用 Ant 配置惰性或增量构建?

    Java编译器提供增量构建 所以javac蚂蚁任务也是如此 但大多数其他进程则不然 考虑到构建过程 它们将一组文件 源 转换为另一组文件 目标 我在这里可以区分两种情况 变压器cannot获取源文件的子集 仅获取整个集合 这里我们只能做懒惰
  • 如何以 REST方式发送 HTML 表单?

    我有一个名为 事实 的资源集合的 URI 以及该集合中每个 事实 资源的 URI 我相信 创建新 事实 的表单应该使用 GET 来请求 但我无法确定应该将其设置为哪个 URI 对集合 URI 的 GET 应返回 事实 资源 URI 的列表
  • qmake 和 QT_INSTALL_PREFIX。如何为 Qt 库选择新位置?

    我是 qmake 的新手 我正在尝试构建一个现有的应用程序 Qt 最初安装在 usr local lib Qt 4 3 5 中 qmake query QT INSTALL PREFIX 返回该路径 我已将 Qt 库移动到另一个位置 生成的
  • 使用 OpenCL 支持构建 OpenCV

    在 CMake 中 我使用 OpenCL Enable ON 构建了 OpenCV 它自动检测到OPENCL INCLUDE DIR路径但是OPENCL LIBRARY即使单击配置后也是空的 为了OPENCL LIBRARY我也没有看到浏览
  • Qt5 CMake 将所有库包含到可执行文件中

    我正在尝试使用 Qt 5 14 构建一个发布模式下的应用程序 并且 Qt Creator 内部一切正常 但是当我尝试单独运行可执行文件时 我收到如下错误 OS Windows 10 Qt 5 14 Cmake 3 5 我尝试过的 设置 CM
  • 编辑 CMakeLists.txt 以使用 -fPIC 进行编译

    我正在尝试为名为 libnifalcon 的 NOVINT Falcon 安装驱动程序 我使用 cmake 创建 make 文件 但是当我运行 make 时出现错误 Linking CXX shared library lib libnif
  • C:epoll和多线程

    我需要创建专门的 HTTP 服务器 为此我计划使用 epoll sycall 但我想利用多个处理器 核心 但我无法提出架构解决方案 ATM我的想法如下 使用自己的epoll描述符创建多个线程 主线程接受连接并将它们分配给线程epoll 但还
  • CXX 编译器标识未知

    我们在使用 Visual Studio 2012 在 Windows 7 64 位下使用 CMake v2 8 12 编译项目时遇到问题 CMake 给我们提供了以下错误 我们已经尝试使用管理员权限从 Visual Studio 命令行启动
  • 为dlib创建共享库

    按照说明使用 cmake 编译 dlib here http dlib net compile html 生成静态 dlib 库 cd examples mkdir build cd build cmake cmake build conf
  • 来自库的 CMake link_directories

    我正在尝试使用 CMake 和 Xcode 从另一个库链接到一个库 这对任何图书馆来说都是一个问题 但为了让事情更容易传达 让我们使用zlib举个例子 这似乎适用于可执行文件 如下所示 LINK DIRECTORIES LIB DIR zl
  • CMake 错误:CMake 无法找到与“MinGW Makefiles”对应的构建程序

    我正在尝试使用 cmake 为 c 构建 Box2D 库 当我运行 cmake gui 时出现错误 CMake Error CMake was unable to find a build program corresponding to
  • 如何在 Windows 中使用 cmake 构建和链接 google benchmark

    我正在尝试构建 google benchmark 并使用 cmake 将其与我的库一起使用 我已经成功构建了 google benchmark 并使用 cmake 成功运行了所有测试 不幸的是 我无法使用 cmake 或 cl 将其与 Wi
  • 就MVC模式而言,Struts 2中使用的Action是什么?

    在Struts2中 控制器将请求分派给Action Action将其传递给后端逻辑 这可以看作是一个非常大的过程 model 处理请求 JSP代表视图 Struts2中如何定义Action 肯定是not一个看法 是控制器还是模型 Strut
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c
  • doxygen INSTALL 无法将文件“.../doxygen/build/bin/doxygen”复制到“/usr/local/bin/doxygen”

    解决了一些之后最初的问题 https stackoverflow com q 50986047 4120196在尝试让 doxygen 工作时 我在遵循以下步骤时偶然发现了下一个错误doxygen安装教程 http www doxygen
  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • cmake:设置多个项目以及它们之间的依赖关系

    我需要帮助为 C 项目编写一个好的 CMakeLists txt 我寻找答案 但我发现了什么 这是我的项目结构 MainProj ProjLib include proj lib h src proj lib cc CMakeLists t
  • 您的 Web 服务版本控制最佳实践是什么?

    我们有 2 个独立的产品 需要通过 Web 服务相互通信 支持 API 版本控制的最佳实践是什么 I have 本文 http www ibm com developerworks webservices library ws versio
  • TFS2010 - SourceGetVersion 中出现错误的变更集

    我目前正在设置 Team Foundation Server 2010 在执行构建时我发现了一个非常奇怪的行为 情况说明 我们有2家分行 发展 Main 所有开发人员仅将代码签入开发分支 构建经理每天一次将一些变更集合并到主分支 在开发分支
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再

随机推荐