CMAKE_<LANG>_BYTE_ORDER¶
在 3.20 版本中添加。
如果已知,则为 <LANG> 编译器目标架构的字节顺序。如果已定义且非空,则值为以下之一:
BIG_ENDIAN目标架构为大端序。
LITTLE_ENDIAN目标架构为小端序。
这为 C、CXX、OBJC、OBJCXX 和 CUDA 语言定义。
如果 CMAKE_OSX_ARCHITECTURES 指定了多个架构,则仅当所有架构共享相同的字节顺序时,CMAKE_<LANG>_BYTE_ORDER 的值才非空。
示例¶
示例:检查字节序¶
在 CMake 项目中检查目标架构的字节序(字节顺序),其中 C 语言是启用的语言之一,并将结果存储在变量 WORDS_BIGENDIAN 中。
if(CMAKE_C_BYTE_ORDER STREQUAL "BIG_ENDIAN")
set(WORDS_BIGENDIAN TRUE)
elseif(CMAKE_C_BYTE_ORDER STREQUAL "LITTLE_ENDIAN")
set(WORDS_BIGENDIAN FALSE)
else()
set(WORDS_BIGENDIAN FALSE)
message(WARNING "Endianness could not be determined.")
endif()
或者,如果项目没有启用 C 语言,可以用其他启用的语言代替。例如,如果启用了 CXX:
if(CMAKE_CXX_BYTE_ORDER STREQUAL "BIG_ENDIAN")
set(WORDS_BIGENDIAN TRUE)
elseif(CMAKE_CXX_BYTE_ORDER STREQUAL "LITTLE_ENDIAN")
set(WORDS_BIGENDIAN FALSE)
else()
set(WORDS_BIGENDIAN FALSE)
message(WARNING "Endianness could not be determined.")
endif()
请注意,在大多数情况下,这可以通过仅检查大端序目标来简化。
if(CMAKE_C_BYTE_ORDER STREQUAL "BIG_ENDIAN")
set(WORDS_BIGENDIAN TRUE)
else()
set(WORDS_BIGENDIAN FALSE)
endif()
示例:按语言进行字节序检查¶
大多数情况下,当今使用的架构在不同编译器之间的字节序是一致的。但以下情况需要按语言进行字节序检查:
交叉编译到不同的架构(例如,大端序嵌入式系统)。
异构工具链,其中一个目标架构用于 C 语言,而另一个目标用于不同的语言。
跨平台重用的静态库或二进制文件(例如,分发预编译的 CUDA 内核)。
if(CMAKE_C_BYTE_ORDER)
message(STATUS "C byte order: ${CMAKE_C_BYTE_ORDER}")
endif()
if(CMAKE_CXX_BYTE_ORDER)
message(STATUS "C++ byte order: ${CMAKE_CXX_BYTE_ORDER}")
endif()
if(CMAKE_CUDA_BYTE_ORDER)
message(STATUS "CUDA byte order: ${CMAKE_CUDA_BYTE_ORDER}")
endif()