CheckCXXSymbolExists

检查 C++ 中的符号作为函数、变量或宏是否存在。

check_cxx_symbol_exists
check_cxx_symbol_exists(<symbol> <files> <variable>)

检查 <symbol> 是否在包含给定的标头 <files> 后可用,并将结果保存在 <variable> 中。将一个参数中的文件列表指定为用分号分隔的列表。 check_cxx_symbol_exists() 可用于检查 C++ 编译器看到的符号,而不是 check_symbol_exists(),后者始终使用 C 编译器。

如果标头文件将符号定义为宏,则认为它可用且可以工作。如果标头文件将符号声明为函数或变量,那么该符号还必须可用于链接。如果符号是类型、枚举值或 C++ 模板,它将不会被识别:考虑改用 CheckTypeSizeCheckSourceCompiles 模块。

注意

如果 <symbol>(可能)为重载函数,此命令不可靠。由于没有可靠的方法来预测系统环境中的给定函数是否可能被定义为重载函数或可能在其他系统上或未来成为重载函数,因此通常建议对任何函数符号使用 CheckSourceCompiles 模块进行检查(除非你确切地知道在其他系统上检查的函数不会重载,或将来也不会重载)。

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

CMAKE_REQUIRED_FLAGS

要传递给编译器的附加标志串。该串必须以空格分隔——;-list 是不起作用的。 CMAKE_<LANG>_FLAGS 的内容及其相关的配置特定变量将自动添加到编译器命令,在 CMAKE_REQUIRED_FLAGS 的内容之前。

CMAKE_REQUIRED_DEFINITIONS

形式为 -DFOO-DFOO=bar 的编译器定义的 ;-list。还将自动添加 <resultVar> 指定的名称的定义。

CMAKE_REQUIRED_INCLUDES

要传递给编译器的头文件搜索路径的 ;-list。这将是唯一使用的头文件搜索路径——将忽略 INCLUDE_DIRECTORIES 目录属性的内容。

CMAKE_REQUIRED_LINK_OPTIONS

在 3.14 版中添加。

要添加到链接命令的选项的 ;-list(有关详细信息,请参见 try_compile())。

CMAKE_REQUIRED_LIBRARIES

要添加到链接命令的库的 ;-list。这些可以是系统库的名称,也可以是 导入的目标(有关详细信息,请参见 try_compile())。

CMAKE_REQUIRED_LINK_DIRECTORIES

在 3.31 版中添加。

要传递给链接器的库搜索路径的 ;-list(有关详细信息,请参见 try_compile())。

CMAKE_REQUIRED_QUIET

在 3.1 版中添加。

如果此变量的值为布尔真值,则将禁止与检查相关的所有状态消息。

例如

include(CheckCXXSymbolExists)

# Check for macro SEEK_SET
check_cxx_symbol_exists(SEEK_SET "cstdio" HAVE_SEEK_SET)
# Check for function std::fopen
check_cxx_symbol_exists(std::fopen "cstdio" HAVE_STD_FOPEN)