CheckSourceCompiles

3.19 版本新增。

此模块提供一个命令,用于检查给定语言的源代码是否可以构建。

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

include(CheckSourceCompiles)

命令

此模块提供以下命令

check_source_compiles

检查给定源代码是否可以为给定语言构建

check_source_compiles(
  <lang>
  <code>
  <variable>
  [FAIL_REGEX <regexes>...]
  [SRC_EXT <extension>]
)

此命令一次性检查在 <code> 中提供的源代码是否可以为代码语言 <lang> 编译(并链接成可执行文件)。检查结果存储在由 <variable> 指定的内部缓存变量中。

参数为

<lang>

要检查的源代码语言。支持的语言有:CCXXCUDAFortranHIPISPCOBJCOBJCXXSwift

版本 3.21 新增:支持 HIP 语言。

版本 3.26 新增:支持 Swift 语言。

<code>

要检查的源代码。这必须是一个完整的程序,如同写入包含主体块的文件中。源代码中使用的所有符号都应像往常一样在其相应的头文件中声明。

<variable>

内部缓存变量的变量名,用于存储检查结果,成功为布尔真,失败为布尔假。

FAIL_REGEX <regexes>...

如果提供了一个或多个正则表达式模式,则通过检查编译器输出中是否有任何内容与任何指定的正则表达式匹配来确定失败。

SRC_EXT <extension>

默认情况下,用于检查的内部测试源文件将获得与请求语言匹配的文件扩展名(例如,C 为 .c,C++ 为 .cxx,Fortran 为 .F90 等)。此选项可用于将其覆盖为 .<extension>

影响检查的变量

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

CMAKE_REQUIRED_FLAGS

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

CMAKE_REQUIRED_DEFINITIONS

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

CMAKE_REQUIRED_INCLUDES

一个分号分隔的头文件搜索路径列表,用于传递给编译器。这些将是唯一使用的头文件搜索路径;INCLUDE_DIRECTORIES 目录属性的内容将被忽略。

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

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

CMAKE_TRY_COMPILE_TARGET_TYPE

在内部,使用 try_compile() 命令执行检查,此变量控制其创建的目标类型。如果此变量设置为 EXECUTABLE(默认),则检查将测试源代码编译并链接为可执行程序。如果设置为 STATIC_LIBRARY,则测试源代码将编译但不链接。

示例

示例:基本用法

以下示例演示了如何使用此模块检查 C++ 编译器是否支持特定的语言特性。在本例中,检查验证编译器是否支持 C++11 lambda 表达式。结果存储在内部缓存变量 HAVE_CXX11_LAMBDAS 中。

include(CheckSourceCompiles)

check_source_compiles(CXX "
  int main()
  {
    auto lambda = []() { return 42; };
    return lambda();
  }
" HAVE_CXX11_LAMBDAS)

示例:使用方括号参数检查代码

以下示例展示了如何检查 C 编译器是否支持 noreturn 属性。代码使用方括号参数提供,以便更方便地处理嵌入式引号。

include(CheckSourceCompiles)

check_source_compiles(C [[
  #if !__has_c_attribute(noreturn)
  #  error "No noreturn attribute"
  #endif
  int main(void) { return 0; }
]] HAVE_NORETURN)

示例:不进行链接的检查

在以下示例中,此模块用于对 Fortran 源代码执行仅编译检查,以确定编译器是否支持 pure 过程属性。

include(CheckSourceCompiles)

block()
  set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

  check_source_compiles(
    Fortran
    "pure subroutine foo()
    end subroutine"
    HAVE_PURE
  )
endblock()

示例:独立检查

在以下示例中,此模块与 CMakePushCheckState 模块结合使用,以在检查 PostgreSQL PGVerbosity 枚举是否包含 PQERRORS_SQLSTATE(PostgreSQL 12 版开始可用)时修改所需库。

include(CheckSourceCompiles)
include(CMakePushCheckState)

find_package(PostgreSQL)

if(TARGET PostgreSQL::PostgreSQL)
  cmake_push_check_state(RESET)
    set(CMAKE_REQUIRED_LIBRARIES PostgreSQL::PostgreSQL)

    check_source_compiles(C "
      #include <libpq-fe.h>
      int main(void)
      {
        PGVerbosity e = PQERRORS_SQLSTATE;
        (void)e;
        return 0;
      }
    " HAVE_PQERRORS_SQLSTATE)
  cmake_pop_check_state()
endif()

另请参阅

  • CheckSourceRuns 模块用于检查源代码是否可以构建并运行。