【问题标题】:CMAKE_SYSTEM_PROCESSOR seems to be empty. What's the best strategy for OS agnostic way to set this?CMAKE_SYSTEM_PROCESSOR 似乎是空的。与操作系统无关的最佳策略是什么?
【发布时间】:2020-02-01 21:31:21
【问题描述】:

我正在尝试根据处理器类型设置一堆 CXX 标志。

IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DAMD64")
ELSE()
    STRING(FIND ${CMAKE_SYSTEM_PROCESSOR} "86" 86_res)
    IF(${86_res} EQUAL -1)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DIA32")
    ENDIF()
    STRING(FIND ${CMAKE_SYSTEM_PROCESSOR} "arm" arm_res)
    IF(${arm_res} EQUAL -1)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DARM")
    ENDIF()
ENDIF()

但无论出于何种原因,CMAKE_SYSTEM_PROCESSOR 为空,无法运行 STREQUAL 比较。为什么这里是空的?

现在我通过运行来设置它

EXEC_PROGRAM(uname ARGS -p OUTPUT_VARIABLE CMAKE_SYSTEM_PROCESSOR)

但这在 Windows 上不起作用,所以我不确定我应该在这里做什么。

【问题讨论】:

  • 您在什么系统上获取空变量?有关变量行为的一些详细信息,请参见例如here:“CMAKE_SYSTEM_PROCESSOR:正在构建的 CPU CMake 的名称。在支持 uname 的系统上,此变量设置为 uname -p 的输出,在 Windows 上,它设置为环境变量 PROCESSOR_ARCHITECTURE 的值。”
  • 忘了提到这些值仅在project() 调用之后设置。
  • Linux <name snipped> 4.4.0-112-generic #135-Ubuntu SMP Fri Jan 19 11:48:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux project() 调用让它有点棘手。我将与操作系统相关的内容设置在一个单独的 cmake 文件中,该文件包含在我的 CMakeLists.txt 文件中。将项目放在包含之前会给我一个You have changed variables that require your cache to be deleted. Configure will be re-run and you may have to reset some variables. 的无限循环
  • 您能添加准备系统的文件内容吗?只是一个猜测,但您知道这些变量中的大多数都有一个..._INIT 对应项吗?而且我承认,我知道上述警告会给出的唯一变量是设置编译器路径或生成器本身(两者都不应该是您的CMakeLists.txt 的一部分)。

标签: cmake


【解决方案1】:

宏必须在AFTER使用PROJECT(...)设置项目名称时使用。

MESSAGE("CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") # EMPTY!
PROJECT(dummy)
MESSAGE("CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") # OK!

输出:

1> CMAKE_SYSTEM_PROCESSOR:
1>-- Selecting Windows SDK version...
1> CMAKE_SYSTEM_PROCESSOR: AMD64

启用交叉编译时可以由toolchains分配。

【讨论】:

  • 谢谢这正是我的问题:)
猜你喜欢
  • 2010-10-25
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多