CheckTypeSize

此模块提供了一个命令,用于检查 C/C++ 类型或表达式的大小。

在 CMake 项目中加载此模块,使用

include(CheckTypeSize)

命令

此模块提供以下命令

check_type_size

检查 C/C++ 类型或表达式是否存在并确定其大小(仅检查一次)

check_type_size(<type> <variable> [BUILTIN_TYPES_ONLY] [LANGUAGE <language>])

参数为

<类型>

要检查的类型或表达式。

<变量>

用于存储检查结果的变量名称和前缀。

BUILTIN_TYPES_ONLY

如果给出,则检查中仅支持编译器内置类型。如果**未**给出,则命令会检查常见头文件 <sys/types.h><stdint.h><stddef.h>,并将结果保存在 HAVE_SYS_TYPES_HHAVE_STDINT_HHAVE_STDDEF_H 内部缓存变量中。类型大小检查会自动包含可用的头文件,从而支持检查头文件中定义的类型。

LANGUAGE <language>

使用 <language> 编译器执行检查。可接受的值为 CCXX。如果未指定,则默认为 C

结果变量

结果报告在以下变量中

HAVE_<变量>

内部缓存变量,保存布尔值 true 或 false,指示类型或表达式 <type> 是否存在。

<变量>

内部缓存变量,保存以下值之一

<大小>

如果类型或表达式存在,它将具有非零大小 <size>(以字节为单位)。

0

当类型具有依赖于架构的大小;这可能发生在 CMAKE_OSX_ARCHITECTURES 具有多个架构时。在这种情况下,<variable>_CODE 包含预处理器测试,将每个架构宏映射到相应的类型大小。架构宏列表存储在 <variable>_KEYS 中,每个键的值存储在 <variable>-<key> 中。

""(空字符串)

当类型或表达式不存在时。

<变量>_CODE

CMake 变量,保存预处理器代码,用于将宏 <variable> 定义为类型的大小,如果类型不存在则不定义宏。

尽管此命令的名称如此,但它也可用于确定更复杂表达式的大小。例如,检查结构成员的大小

check_type_size("((struct something*)0)->member" SIZEOF_MEMBER)

影响检查的变量

在调用此命令之前,可以设置以下变量来修改检查的运行方式

CMAKE_REQUIRED_FLAGS

要传递给编译器的额外标志,以空格分隔的字符串。以分号分隔的列表将不起作用。CMAKE_<LANG>_FLAGS 及其关联的特定配置变量 CMAKE_<LANG>_FLAGS_<CONFIG> 的内容会自动添加到编译器命令之前,然后是此变量的内容。

CMAKE_REQUIRED_DEFINITIONS

编译器定义的分号分隔列表,每个定义的形式为 -DFOO-DFOO=bar。还会自动添加一个定义,用于检查命令的结果变量参数指定的名称。

CMAKE_REQUIRED_INCLUDES

要传递给编译器的头文件搜索路径的分号分隔列表。这些将是唯一使用的头文件搜索路径;INCLUDE_DIRECTORIES 目录属性的内容将被忽略。

CMAKE_REQUIRED_LINK_OPTIONS

3.14 版新增。

要添加到链接命令的选项的分号分隔列表(更多详情请参阅 try_compile())。

CMAKE_REQUIRED_LIBRARIES

要添加到链接命令的库的分号分隔列表。这些可以是系统库的名称,也可以是导入目标(更多详情请参阅 try_compile())。

CMAKE_REQUIRED_LINK_DIRECTORIES

在版本 3.31 中添加。

要传递给链接器的库搜索路径的分号分隔列表(更多详情请参阅 try_compile())。

CMAKE_REQUIRED_QUIET

版本 3.1 中新增。

如果此变量评估为布尔真值,则与检查关联的所有状态消息都将被抑制。

CMAKE_EXTRA_INCLUDE_FILES

在执行检查时要包含的额外头文件的分号分隔列表

示例

考虑以下代码

include(CheckTypeSize)

# Check for size of long.
check_type_size(long SIZEOF_LONG)
message("HAVE_SIZEOF_LONG: ${HAVE_SIZEOF_LONG}")
message("SIZEOF_LONG: ${SIZEOF_LONG}")
message("SIZEOF_LONG_CODE: ${SIZEOF_LONG_CODE}")

在 64 位架构上,输出可能类似于这样

HAVE_SIZEOF_LONG: TRUE
SIZEOF_LONG: 8
SIZEOF_LONG_CODE: #define SIZEOF_LONG 8

在 Apple 平台上,当 CMAKE_OSX_ARCHITECTURES 具有多个架构时,类型可能具有依赖于架构的大小。例如,对于以下代码

include(CheckTypeSize)

check_type_size(long SIZEOF_LONG)
message("HAVE_SIZEOF_LONG: ${HAVE_SIZEOF_LONG}")
message("SIZEOF_LONG: ${SIZEOF_LONG}")
foreach(key IN LISTS SIZE_OF_LONG_KEYS)
  message("key: ${key}")
  message("value: ${SIZE_OF_LONG-${key}}")
endforeach()
message("SIZEOF_LONG_CODE:
${SIZEOF_LONG_CODE}")

结果可能为

HAVE_SIZEOF_LONG: TRUE
SIZEOF_LONG: 0
key: __i386
value: 4
key: __x86_64
value: 8
SIZEOF_LONG_CODE:
#if defined(__i386)
# define SIZE_OF_LONG 4
#elif defined(__x86_64)
# define SIZE_OF_LONG 8
#else
# error SIZE_OF_LONG unknown
#endif