CMAKE:忽略唯一变量名称
CMAKE: Unique variable names ignored
我在多个平台上有一个跨平台项目运行。项目中的每个目录中都有一个 CmakeLists.txt,大多数 cmake 文件的代码类似于:
输入:
# set target os
if (DEFINED target_os)
SET (HRAD_SDK_TARGET_OS "${target_os}")
else ()
SET (HRAD_SDK_TARGET_OS "${CMAKE_SYSTEM_NAME}")
endif ()
message(STATUS "=============== SDK: ccccccccccccccccccccccccccccccccccccccccccccccc==============")
message(STATUS "target_os: ${target_os}")
message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")
# set target bit
if ("${HRAD_SDK_TARGET_OS}" MATCHES "Linux")
message(STATUS "=============== SDK: ddddddddddddddddddddddddddddddddddddddddddddddd==============")
message(STATUS "target_os: ${target_os}")
message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")
if ("${target_arch_bit}" MATCHES "64")
SET (TARGET_ARCH_BIT -m64)
else ()
SET (TARGET_ARCH_BIT -m32)
endif ()
endif ()
message(STATUS "TARGET_ARCH_BIT: ${TARGET_ARCH_BIT}")
# set flags
SET (ADDITION_C_FLAGS "-Wno-unused -Wno-parentheses")
if ("${HRAD_SDK_TARGET_OS}" MATCHES "LinuxARM")
message(STATUS "=============== SDK: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==============")
message(STATUS "target_os: ${target_os}")
message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")
在上面的例子中,target_os
可以有Linux, LinuxARM, MacOSX, QNX
等值
然而,由于某些原因它不喜欢LinuxARM
这个名字,它似乎将其视为Linux
。
在上面的代码中,即使 target_os
是 LinuxARM
,以某种方式检查 Linux
的循环是正确的,我得到如下输出并且编译失败 -
输出:
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- =============== SDK: ccccccccccccccccccccccccccccccccccccccccccccccc==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- =============== SDK: ddddddddddddddddddddddddddddddddddddddddddddddd==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- TARGET_ARCH_BIT: -m32
-- =============== SDK: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- =============== utils: CMakeLists.txt ==============
-- target os: LinuxARM
-- TARGET_OS:
-- CMAKE_C_FLAGS: -fPIC -Wno-unused -Wno-parentheses -D_REENTRANT
-- CMAKE_CPP_FLAGS: -fPIC -Wno-unused -Wno-parentheses -std=gnu++0x -D_REENTRANT
-- CMAKE_CXX_FLAGS: -fPIC -Wno-unused -Wno-parentheses -std=gnu++0x -D_REENTRANT
-- CMAKE_LD_FLAGS: -Wl -rpath-link,/usr/arm-linux-gnueabihf/lib
-- CMAKE_C_COMPILER: /usr/bin/arm-linux-gnueabihf-gcc
-- CMAKE_CPP_COMPILER: /usr/bin/arm-linux-gnueabihf-g++
-- CMAKE_CXX_COMPILER: /usr/bin/arm-linux-gnueabihf-g++
如您所见,它不应该出现在包含该行的块中
ddddddddddddddddddddddddd
如果我将 LinuxARM
重命名为其他名称,例如 LINUX_ARM
或完全随机的名称,例如 NEWHLOS
,那么代码可以正常编译。
似乎因为 Linux
是 LinuxARM
的子集,它只是将其视为 Linux
。
有人可以帮助解释为什么它不喜欢 LinuxARM
吗?我读到 cmake 变量名称区分大小写,但在我的例子中,变量是完全唯一的。
此外,我删除了所有 cmake 缓存文件并删除了所有以前的构建文件,但问题仍然存在。
更新 1:
LINUX_ARM
似乎与 Linux
没有问题。它工作正常。
if()
的 MATCHES
子命令执行 正则表达式匹配, 为 documented。当然,文本 LinuxARM
匹配正则表达式 Linux
。你要的是STREQUAL
,不是MATCHES
:
if ("${HRAD_SDK_TARGET_OS}" STREQUAL "Linux")
我在多个平台上有一个跨平台项目运行。项目中的每个目录中都有一个 CmakeLists.txt,大多数 cmake 文件的代码类似于:
输入:
# set target os
if (DEFINED target_os)
SET (HRAD_SDK_TARGET_OS "${target_os}")
else ()
SET (HRAD_SDK_TARGET_OS "${CMAKE_SYSTEM_NAME}")
endif ()
message(STATUS "=============== SDK: ccccccccccccccccccccccccccccccccccccccccccccccc==============")
message(STATUS "target_os: ${target_os}")
message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")
# set target bit
if ("${HRAD_SDK_TARGET_OS}" MATCHES "Linux")
message(STATUS "=============== SDK: ddddddddddddddddddddddddddddddddddddddddddddddd==============")
message(STATUS "target_os: ${target_os}")
message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")
if ("${target_arch_bit}" MATCHES "64")
SET (TARGET_ARCH_BIT -m64)
else ()
SET (TARGET_ARCH_BIT -m32)
endif ()
endif ()
message(STATUS "TARGET_ARCH_BIT: ${TARGET_ARCH_BIT}")
# set flags
SET (ADDITION_C_FLAGS "-Wno-unused -Wno-parentheses")
if ("${HRAD_SDK_TARGET_OS}" MATCHES "LinuxARM")
message(STATUS "=============== SDK: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==============")
message(STATUS "target_os: ${target_os}")
message(STATUS "HRAD_SDK_TARGET_OS: ${HRAD_SDK_TARGET_OS}")
在上面的例子中,target_os
可以有Linux, LinuxARM, MacOSX, QNX
等值
然而,由于某些原因它不喜欢LinuxARM
这个名字,它似乎将其视为Linux
。
在上面的代码中,即使 target_os
是 LinuxARM
,以某种方式检查 Linux
的循环是正确的,我得到如下输出并且编译失败 -
输出:
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- =============== SDK: ccccccccccccccccccccccccccccccccccccccccccccccc==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- =============== SDK: ddddddddddddddddddddddddddddddddddddddddddddddd==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- TARGET_ARCH_BIT: -m32
-- =============== SDK: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==============
-- target_os: LinuxARM
-- HRAD_SDK_TARGET_OS: LinuxARM
-- =============== utils: CMakeLists.txt ==============
-- target os: LinuxARM
-- TARGET_OS:
-- CMAKE_C_FLAGS: -fPIC -Wno-unused -Wno-parentheses -D_REENTRANT
-- CMAKE_CPP_FLAGS: -fPIC -Wno-unused -Wno-parentheses -std=gnu++0x -D_REENTRANT
-- CMAKE_CXX_FLAGS: -fPIC -Wno-unused -Wno-parentheses -std=gnu++0x -D_REENTRANT
-- CMAKE_LD_FLAGS: -Wl -rpath-link,/usr/arm-linux-gnueabihf/lib
-- CMAKE_C_COMPILER: /usr/bin/arm-linux-gnueabihf-gcc
-- CMAKE_CPP_COMPILER: /usr/bin/arm-linux-gnueabihf-g++
-- CMAKE_CXX_COMPILER: /usr/bin/arm-linux-gnueabihf-g++
如您所见,它不应该出现在包含该行的块中
ddddddddddddddddddddddddd
如果我将 LinuxARM
重命名为其他名称,例如 LINUX_ARM
或完全随机的名称,例如 NEWHLOS
,那么代码可以正常编译。
似乎因为 Linux
是 LinuxARM
的子集,它只是将其视为 Linux
。
有人可以帮助解释为什么它不喜欢 LinuxARM
吗?我读到 cmake 变量名称区分大小写,但在我的例子中,变量是完全唯一的。
此外,我删除了所有 cmake 缓存文件并删除了所有以前的构建文件,但问题仍然存在。
更新 1:
LINUX_ARM
似乎与 Linux
没有问题。它工作正常。
if()
的 MATCHES
子命令执行 正则表达式匹配, 为 documented。当然,文本 LinuxARM
匹配正则表达式 Linux
。你要的是STREQUAL
,不是MATCHES
:
if ("${HRAD_SDK_TARGET_OS}" STREQUAL "Linux")