try_compile

尝试构建一些代码。

尝试编译整个项目

try_compile(<compileResultVar> PROJECT <projectName>
            SOURCE_DIR <srcdir>
            [BINARY_DIR <bindir>]
            [TARGET <targetName>]
            [LOG_DESCRIPTION <text>]
            [NO_CACHE]
            [NO_LOG]
            [CMAKE_FLAGS <flags>...]
            [OUTPUT_VARIABLE <var>])

version 3.25 中添加。

尝试构建项目。构建成功将返回 TRUE,构建失败将返回 FALSE,位于 <compileResultVar> 中。

在此形式中,<srcdir> 应该包含一个带有 CMakeLists.txt 文件和所有源的完整的 CMake 项目。此命令执行后不会删除 <bindir><srcdir>。指定 <targetName> 以构建特定的目标,而不是 allALL_BUILD 目标。请参阅下方了解其他选项的含义。

version 3.24 中更改:描述平台设置的 CMake 变量以及 CMAKE_TRY_COMPILE_PLATFORM_VARIABLES 变量列出的那些变量将传播到项目的构建配置中。请参阅策略 CMP0137。之前仅通过 源文件 签名完成此操作。

version 3.26 中添加:如果没有指定 NO_LOG 选项,此命令将记录 configure-log try_compile 事件

version 3.30 中添加:如果 PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE 全局属性设置为 true,CMAKE_PROJECT_TOP_LEVEL_INCLUDES 将传播到项目的构建配置中。

此命令支持低版本的 CMake(3.25 及更早版本)的备用签名。建议使用上面的签名,以提高清晰度。

try_compile(<compileResultVar> <bindir> <srcdir>
            <projectName> [<targetName>]
            [CMAKE_FLAGS <flags>...]
            [OUTPUT_VARIABLE <var>])

尝试编译源文件

try_compile(<compileResultVar>
            [SOURCES_TYPE <type>]
            <SOURCES <srcfile...>                 |
             SOURCE_FROM_CONTENT <name> <content> |
             SOURCE_FROM_VAR <name> <var>         |
             SOURCE_FROM_FILE <name> <path>       >...
            [LOG_DESCRIPTION <text>]
            [NO_CACHE]
            [NO_LOG]
            [CMAKE_FLAGS <flags>...]
            [COMPILE_DEFINITIONS <defs>...]
            [LINK_OPTIONS <options>...]
            [LINK_LIBRARIES <libs>...]
            [LINKER_LANGUAGE <lang>]
            [OUTPUT_VARIABLE <var>]
            [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
            [<LANG>_STANDARD <std>]
            [<LANG>_STANDARD_REQUIRED <bool>]
            [<LANG>_EXTENSIONS <bool>]
            )

version 3.25 中添加。

尝试从一个或多个源文件(由 CMAKE_TRY_COMPILE_TARGET_TYPE 变量确定)构建一个可执行文件或静态函数库。构建成功则在 <compileResultVar> 中返回 TRUE,构建失败则返回 FALSE

在此形式中,必须指定一个或多个源文件。此外,SOURCES 和/或 SOURCE_FROM_* 之一必须出现在其他关键字之前。

如果 CMAKE_TRY_COMPILE_TARGET_TYPE 未设置或设置为 EXECUTABLE,则源代码必须包含 main 的定义,并且 CMake 将创建一个 CMakeLists.txt 文件,以将源文件构建为可执行文件。如果 CMAKE_TRY_COMPILE_TARGET_TYPE 设置为 STATIC_LIBRARY,则将构建一个静态库,并且不需要 main 的定义。对于可执行文件,生成的 CMakeLists.txt 文件将包含类似以下内容的内容

add_definitions(<expanded COMPILE_DEFINITIONS from caller>)
include_directories(${INCLUDE_DIRECTORIES})
link_directories(${LINK_DIRECTORIES})
add_executable(cmTryCompileExec <srcfile>...)
target_link_options(cmTryCompileExec PRIVATE <LINK_OPTIONS from caller>)
target_link_libraries(cmTryCompileExec ${LINK_LIBRARIES})

对于每个 try_compile 操作,CMake 会自动在 ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeScratch 下自动生成一个具有不指定名称的唯一目录。除非将 --debug-trycompile 传递给 cmake,否则会自动清理这些目录。上一次运行中的此类目录也会在任何 cmake 执行的开始进行无条件清理。

此命令支持低版本的 CMake(3.25 及更早版本)的备用签名。建议使用上面的签名,以提高清晰度。

try_compile(<compileResultVar> <bindir> <srcfile|SOURCES srcfile...>
            [CMAKE_FLAGS <flags>...]
            [COMPILE_DEFINITIONS <defs>...]
            [LINK_OPTIONS <options>...]
            [LINK_LIBRARIES <libs>...]
            [OUTPUT_VARIABLE <var>]
            [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
            [<LANG>_STANDARD <std>]
            [<LANG>_STANDARD_REQUIRED <bool>]
            [<LANG>_EXTENSIONS <bool>]
            )

在此版本中,try_compile 将使用 <bindir>/CMakeFiles/CMakeTmp 进行操作,并且所有此类文件将自动清理。进行调试时,可以将 --debug-trycompile 传递给 cmake 以避免这种清理。但是,如果具有相同的 <bindir>,则多个顺序的 try_compile 操作将重复使用此单个输出目录,从而一次只能调试一个此类 try_compile 调用。建议使用较新的签名以简化对多个 try_compile 操作进行调试。

选项

上述签名的选项是

CMAKE_FLAGS <flags>...

指定格式为 -DVAR:TYPE=VALUE 的标记,将其传递给用于驱动测试构建的 cmake(1) 命令行。以上示例展示了如何使用变量 COMPILE_DEFINITIONSINCLUDE_DIRECTORIESLINK_DIRECTORIESLINK_LIBRARIESLINK_OPTIONS 的值。编译器选项可以传递,就像 CMAKE_FLAGS -DCOMPILE_DEFINITIONS=-Werror

COMPILE_DEFINITIONS <defs>...

指定 -Ddefinition 参数,将其传递给生成的测试项目中的 add_definitions()

COPY_FILE <fileName>

将构建的可执行文件或静态库复制到给定的 <fileName>

COPY_FILE_ERROR <var>

COPY_FILE 之后使用,以捕获在尝试复制文件时遇到的任何错误消息,并存储到变量 <var> 中。

LINK_LIBRARIES <libs>...

指定要在生成的项目中链接的库。库的列表可以引用系统库和来自调用项目的 导入目标

如果指定了此选项,那么任何提供给 CMAKE_FLAGS 选项的 -DLINK_LIBRARIES=... 值都将被忽略。

在第 3.29 版本中添加: 别名目标也支持导入库。

LINK_OPTIONS <options>...

在第 3.14 版本中添加。

指定要传递给 target_link_options() 或用于设置生成的项目中的 STATIC_LIBRARY_OPTIONS 目标属性的链接步骤选项,具体取决于变量 CMAKE_TRY_COMPILE_TARGET_TYPE

LINKER_LANGUAGE <lang>

在第 3.29 版本中添加。

指定已生成项目的 LINKER_LANGUAGE 目标属性。当使用不同语言的多源文件时,将此设置为包含程序入口点的源文件的语言,如 main

LOG_DESCRIPTION <text>

在版本 3.26 中添加。

指定检查目的的非空文本描述。此内容记录在 cmake-configure-log(7) 条目中。

NO_CACHE

version 3.25 中添加。

结果存储在普通变量中,而不是缓存条目中。

结果变量通常被缓存,以便可以使用简单模式避免在后续执行 CMake 时重复测试

if(NOT DEFINED RESULTVAR)
  # ...(check-specific setup code)...
  try_compile(RESULTVAR ...)
  # ...(check-specific logging and cleanup code)...
endif()

如果保护变量和结果变量不同(例如,如果测试是较大检查的一部分),NO_CACHE 可用于避免将中间结果变量泄漏到缓存中。

NO_LOG

在版本 3.26 中添加。

不为此次调用记录 cmake-configure-log(7) 条目。

OUTPUT_VARIABLE <var>

将构建过程中的输出存储在给定变量中。

SOURCE_FROM_CONTENT <name> <content>

version 3.25 中添加。

<content> 写入操作目录中名为 <name> 的文件。当文件的内容以动态方式指定时,可以使用此方法绕过单独编写源文件的需要。指定的 <name> 不允许包含路径组件。

可多次指定 SOURCE_FROM_CONTENT

SOURCE_FROM_FILE <name> <path>

version 3.25 中添加。

<path> 复制到操作目录中名为 <name> 的文件。此方法可用于将文件合并到操作目录,如果已经存在的源(即,作为项目源代码库中的独立文件)需要引用由 SOURCE_FROM_* 创建的其他文件,则此方法非常有用。(否则,SOURCES 通常更加方便。)指定的 <name> 不允许包含路径组件。

SOURCE_FROM_VAR <name> <var>

version 3.25 中添加。

<var> 的内容写入操作目录中名为 <name> 的文件中。此命令类似于 SOURCE_FROM_CONTENT,但前者从指定的 CMake 变量中获取内容,而非直接获取,这在通过包装 try_compile 的函数传递参数时尚且有用。指定的 <name> 不应包含路径组件。

SOURCE_FROM_VAR 可以多次指定。

SOURCES_TYPE <type>

在 3.28 版本中添加。

可以通过 SOURCES_TYPE 参数对源进行分类。指定后,随后的所有指定源将被视为该类型,直到指定另一个 SOURCES_TYPE。可用类型如下

NORMAL

在生成的 project 中,源不会被添加到任何 FILE_SET 中。

CXX_MODULE

在 3.28 版本中添加。

在生成的 project 中,源会被添加到类型为 CXX_MODULESFILE_SET 中。

源的默认类型为 NORMAL

<LANG>_STANDARD <std>

在 3.8 版本中添加。

指定生成的 project 的 C_STANDARDCXX_STANDARDOBJC_STANDARDOBJCXX_STANDARDCUDA_STANDARD 目标属性。

<LANG>_STANDARD_REQUIRED <bool>

在 3.8 版本中添加。

指定生成的 project 的 C_STANDARD_REQUIREDCXX_STANDARD_REQUIREDOBJC_STANDARD_REQUIREDOBJCXX_STANDARD_REQUIREDCUDA_STANDARD_REQUIRED 目标属性。

<LANG>_EXTENSIONS <bool>

在 3.8 版本中添加。

指定生成项目的以下目标属性:C_EXTENSIONSCXX_EXTENSIONSOBJC_EXTENSIONSOBJCXX_EXTENSIONSCUDA_EXTENSIONS

其他行为设置

3.4 版新增:如果已设置,以下变量会传递到生成的 try_compile CMakeLists.txt 中,以使用默认值初始化编译目标属性。

如果 CMP0056 设置为 NEW,则 CMAKE_EXE_LINKER_FLAGS 也会传递过来。

3.14 版中更改:如果 CMP0083 设置为 NEW,则为了在链接时获取正确行为,必须在调用 try_compile 命令之前调用 CheckPIESupported 模块中的 check_pie_supported() 命令。

当前的 CMP0065CMP0083 设置通过传播到已生成的测试项目中。

设置变量,CMAKE_TRY_COMPILE_CONFIGURATION 以选择构建配置

  • 对于多配置生成器,这将选择要构建的配置。

  • 对于单配置生成器,这将在测试项目中设置 CMAKE_BUILD_TYPE

3.6 版中添加:设置 CMAKE_TRY_COMPILE_TARGET_TYPE 变量来指定用于源文件签名的目标类型。

3.6 版中添加:设置 CMAKE_TRY_COMPILE_PLATFORM_VARIABLES 变量来指定必须传播到测试项目中的变量。该变量只适用于工具链文件,并且只受 try_compile() 命令源文件形式的约束,而不是在给定整个项目时受约束。

3.8 版中更改:如果 CMP0067 设置为 NEW,或者使用了任一 <LANG>_STANDARD<LANG>_STANDARD_REQUIRED<LANG>_EXTENSIONS 选项,则就会尊重语言标准变量

其值用于设置已生成项目中的对应目标属性(除非被显式选项覆盖)。

版本 3.14 中已更改: 对于 Green Hills MULTI 生成器,GHS 工具集和目标系统自定义缓存变量也将传播到测试项目中。

3.24 版本中已添加: 可以设置 CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES 变量以禁用将平台变量传递到测试项目中。

3.25 版本中已添加: 如果 CMP0141 设置为 NEW,则可以使用 CMAKE_MSVC_DEBUG_INFORMATION_FORMAT 来指定 MSVC 调试信息格式。

3.30 版本中已添加: 如果 PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE 全局属性设置为 true,则在使用 整个项目签名 时,CMAKE_PROJECT_TOP_LEVEL_INCLUDES 会传播到测试项目的构建配置中。

另请参见