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_H
、HAVE_STDINT_H
和HAVE_STDDEF_H
内部缓存变量中。类型大小检查会自动包含可用的头文件,从而支持检查头文件中定义的类型。LANGUAGE <language>
使用
<language>
编译器执行检查。可接受的值为C
和CXX
。如果未指定,则默认为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