CheckVariableExists

此模块提供了一个命令,用于检查 C 变量是否存在。

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

include(CheckVariableExists)

命令

此模块提供以下命令

check_variable_exists

检查 C 变量是否存在(仅一次)

check_variable_exists(<var> <variable>)

此命令尝试编译和链接一个引用指定 C 变量 <var> 的 C 测试程序。检查是否成功的布尔结果存储在一个内部缓存变量 <variable> 中。

注意

建议使用 CheckSymbolExistsCheckSourceCompiles 代替此命令,以实现更可靠的检测。此命令仅执行链接检查,无法检测变量是否也在系统或库头文件中声明。它也无法检测可能被定义为预处理器宏的变量。

影响检查的变量

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

CMAKE_REQUIRED_FLAGS

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

CMAKE_REQUIRED_DEFINITIONS

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

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 中新增。

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

示例

示例:基本用法

在以下示例中,检查链接器是否看到 C 变量 tzname,并将检查结果存储在 PROJECT_HAVE_TZNAME 内部缓存变量中。

include(CheckVariableExists)

check_variable_exists(tzname PROJECT_HAVE_TZNAME)

示例:带链接库的独立检查

在以下示例中,此模块与 CMakePushCheckState 模块结合使用,以使用 CMAKE_REQUIRED_LIBRARIES 变量链接额外的所需库。例如,在 find 模块中,检查 Net-SNMP 库是否具有 usmHMAC192SHA256AuthProtocol 数组。

include(CheckVariableExists)
include(CMakePushCheckState)

find_library(SNMP_LIBRARY NAMES netsnmp)

if(SNMP_LIBRARY)
  cmake_push_check_state(RESET)

  set(CMAKE_REQUIRED_LIBRARIES ${SNMP_LIBRARY})

  check_variable_exists(usmHMAC192SHA256AuthProtocol SNMP_HAVE_SHA256)

  cmake_pop_check_state()
endif()

另请参阅