尝试编译

尝试构建一些代码。

尝试编译整个项目

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>])

在 3.25 版本加入.

尝试构建一个项目。构建成功返回“TRUE”,构建失败在“<compileResultVar>”中返回“FALSE”。

在这种形式中,<srcdir> 应该包含一个完整的 CMake 项目,其中包含一个 CMakeLists.txt 文件和所有源代码。 <bindir><srcdir> 运行该命令后不会被删除。指定 <targetName> 以构建特定目标而不是 allALL_BUILD 目标。其他选项的含义见下文。

在 3.24 版本发生变更: 描述平台设置的 CMake 变量,以及由 CMAKE_TRY_COMPILE_PLATFORM_VARIABLES 变量列出的变量,被传播到项目的构建配置中。请参阅政策:policy:CMP0137。以前这只能通过 source file 签名来完成。

在 3.26 版本加入: 如果未指定 NO_LOG 选项,此命令会记录 configure-log try_compile 事件

此命令支持 CMake 3.25 之前的备用签名。为清楚起见,建议使用上面的签名。

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

尝试编译源文件

try_compile(<compileResultVar>
            <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>...]
            [OUTPUT_VARIABLE <var>]
            [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
            [<LANG>_STANDARD <std>]
            [<LANG>_STANDARD_REQUIRED <bool>]
            [<LANG>_EXTENSIONS <bool>]
            )

在 3.25 版本加入.

尝试从一个或多个源文件(哪个由 CMAKE_TRY_COMPILE_TARGET_TYPE 变量确定)构建可执行文件或静态库。构建成功返回“TRUE”,构建失败在“<compileResultVar>”中返回“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})

CMake 会自动为每个 try_compile 操作在 ${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 <标志>...

指定形式的标志:option:-DVAR:TYPE=VALUE <cmake -D> 传递给用于驱动测试构建的 cmake(1) 命令行。上面的示例显示了如何使用变量“INCLUDE_DIRECTORIES”、“LINK_DIRECTORIES”和“LINK_LIBRARIES”的值。

COMPILE_DEFINITIONS <defs>...

在生成的测试项目中指定要传递给 add_definitions 的 -Ddefinition 参数。

COPY_FILE <文件名>

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

COPY_FILE_ERROR <var>

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

LINK_LIBRARIES <库>...

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

如果指定了此选项,则将忽略任何赋予“CMAKE_FLAGS”选项的“-DLINK_LIBRARIES=...”值。

LINK_OPTIONS <选项>...

在 3.14 版本加入.

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

LOG_DESCRIPTION <文本>

在 3.26 版本加入.

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

NO_CACHE

在 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 <变量>

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

SOURCE_FROM_CONTENT <名称> <内容>

在 3.25 版本加入.

<content> 写入操作目录中名为 <name> 的文件。这可用于在动态指定文件内容时绕过单独编写源文件的需要。指定的``<name>`` 不允许包含路径组件。

SOURCE_FROM_CONTENT 可以指定多次。

SOURCE_FROM_FILE <名称> <路径>

在 3.25 版本加入.

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

SOURCE_FROM_VAR <名称> <变量>

在 3.25 版本加入.

<var> 的内容写入操作目录中名为 <name> 的文件。这与 SOURCE_FROM_CONTENT 相同,但不是直接从指定的 CMake 变量中获取内容,这在通过包装 try_compile 的函数传递参数时可能很有用。指定的``<name>`` 不允许包含路径组件。

SOURCE_FROM_VAR 可以指定多次。

<LANG>_STANDARD <std>

在 3.8 版本加入.

指定生成项目的 C_STANDARD、CXX_STANDARD、OBJC_STANDARD、OBJCXX_STANDARD 或 CUDA_STANDARD 目标属性。

<LANG>_STANDARD_REQUIRED <bool>

在 3.8 版本加入.

指定生成项目的 C_STANDARD_REQUIRED、CXX_STANDARD_REQUIRED、OBJC_STANDARD_REQUIRED、OBJCXX_STANDARD_REQUIRED 或 CUDA_STANDARD_REQUIRED 目标属性。

<LANG>_EXTENSIONS <bool>

在 3.8 版本加入.

指定生成的项目的 C_EXTENSIONS、CXX_EXTENSIONS、OBJC_EXTENSIONS、OBJCXX_EXTENSIONS 或 CUDA_EXTENSIONS 目标属性。

其他行为设置

在 3.4 版本加入: 如果设置,以下变量将传递到生成的 try_compile CMakeLists.txt 以使用默认值初始化编译目标属性:

如果 CMP0056 设置为 NEW,那么 CMAKE_EXE_LINKER_FLAGS 也会传入。

在 3.14 版本发生变更: 如果 CMP0083 设置为 NEW,那么为了在链接时获得正确的行为,必须在使用前调用 CheckPIESupported 模块中的 check_pie_supported() 命令``try_compile`` 命令。

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 调试信息格式。

也可以看看