【发布时间】: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/Linuxproject() 调用让它有点棘手。我将与操作系统相关的内容设置在一个单独的 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