检查CXXSymbolExists

检查一个符号在 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++ 模板,它将无法识别:考虑改用 CheckTypeSize 或 CheckSourceCompiles 模块。

备注

当``<symbol>``(可能)是一个重载函数时,这个命令是不可靠的。由于没有可靠的方法来预测系统环境中的给定函数是否可能被定义为重载函数,或者可能是其他系统上的重载函数或将来会变成重载函数,因此通常建议使用 :module: CheckCXXSourceCompiles 模块用于检查任何函数符号(除非您确定知道被检查的函数没有在其他系统上过载或将来不会过载)。

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

CMAKE_REQUIRED_FLAGS

编译命令行标志的字符串。

CMAKE_REQUIRED_DEFINITIONS

a ;-list 要定义的宏 (-DFOO=bar)。

CMAKE_REQUIRED_INCLUDES

a ;-list 要传递给编译器的标头搜索路径。

CMAKE_REQUIRED_LINK_OPTIONS

在 3.14 版本加入: a ;-list 添加到链接命令的选项。

CMAKE_REQUIRED_LIBRARIES

a ;-list 要添加到链接命令的库。请参阅政策:policy:CMP0075

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)