Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux CMAKE:忽略唯一变量名_Linux_Cmake_Cross Platform_Embedded Linux - Fatal编程技术网

Linux CMAKE:忽略唯一变量名

Linux CMAKE:忽略唯一变量名,linux,cmake,cross-platform,embedded-linux,Linux,Cmake,Cross Platform,Embedded 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

我有一个跨平台的项目在多个平台上运行。项目中的每个目录中都有一个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}")
-- 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++
在上面的示例中,
target_os
可以具有诸如
Linux、LinuxARM、MacOSX、QNX
等值

然而,由于某些原因,它不喜欢名称
LinuxARM
,它似乎将其视为
Linux

在上面的代码中,即使
target\u os
LinuxARM
,在某种程度上,
Linux
检查的循环是真的,我得到如下输出,编译失败-

输出:

# 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}")
-- 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++
如您所见,它不应该出现在包含行的块中
dddddddddddddddddddddddddddd

如果我将
LinuxARM
重命名为其他名称,如
LINUX\u ARM
或完全随机的名称,如
NEWHLOS
,那么代码编译良好

似乎因为
Linux
LinuxARM
的一个子集,所以它只是将其视为
Linux

有人能帮我解释为什么它不喜欢LinuxARM吗?我读到cmake变量名区分大小写,但在我的例子中,变量是完全唯一的

此外,我删除了所有cmake缓存文件,并删除了所有以前的构建文件,但问题仍然存在

更新1:

# 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}")
-- 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++

LINUX\u ARM
似乎对
LINUX
没有问题。它工作正常。

if()的
子命令匹配
正则表达式匹配,如下所示。当然,文本
LinuxARM
与regex
Linux
匹配。您需要的是
STREQUAL
,而不是
匹配项

if ("${HRAD_SDK_TARGET_OS}" STREQUAL "Linux")

if()
匹配子命令执行正则表达式匹配,如下所示。当然,文本
LinuxARM
与regex
Linux
匹配。您需要的是
STREQUAL
,而不是
匹配项

if ("${HRAD_SDK_TARGET_OS}" STREQUAL "Linux")

谢谢,我不知道MATCHES会进行正则表达式匹配。@kaushal阅读文档会让您省去编写SO问题并等待asnwer的麻烦;-)是的,会的。这是我第一次使用Cmake,所以仍在学习。:)谢谢,我不知道MATCHES会进行正则表达式匹配。@kaushal阅读文档会让您省去编写SO问题并等待asnwer的麻烦;-)是的,会的。这是我第一次使用Cmake,所以仍在学习。:)