CMAKE_<LANG>_BYTE_ORDER

在 3.20 版本中添加。

如果已知,则为 <LANG> 编译器目标架构的字节顺序。如果已定义且非空,则值为以下之一:

BIG_ENDIAN

目标架构为大端序。

LITTLE_ENDIAN

目标架构为小端序。

这为 CCXXOBJCOBJCXXCUDA 语言定义。

如果 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()