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。还将自动添加对检查命令的 result variable 参数指定的名称的定义。

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 变量链接其他必需的库。例如,在查找模块中,检查 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()

另请参阅