CheckVariableExists¶
此模块提供了一个命令,用于检查 C 变量是否存在。
在 CMake 项目中加载此模块,使用
include(CheckVariableExists)
命令¶
此模块提供以下命令
- check_variable_exists¶
检查 C 变量是否存在(仅一次)
check_variable_exists(<var> <variable>)
此命令尝试编译和链接一个引用指定 C 变量
<var>
的 C 测试程序。检查是否成功的布尔结果存储在一个内部缓存变量<variable>
中。注意
建议使用
CheckSymbolExists
或CheckSourceCompiles
代替此命令,以实现更可靠的检测。此命令仅执行链接检查,无法检测变量是否也在系统或库头文件中声明。它也无法检测可能被定义为预处理器宏的变量。影响检查的变量
在调用此命令之前,可以设置以下变量来修改检查的运行方式
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()
另请参阅¶
CheckSymbolExists
模块用于检查 C 符号是否存在。