try_run

尝试编译然后运行一些代码。

尝试编译并运行源文件

try_run(<runResultVar> <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>...]
        [COMPILE_OUTPUT_VARIABLE <var>]
        [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
        [<LANG>_STANDARD <std>]
        [<LANG>_STANDARD_REQUIRED <bool>]
        [<LANG>_EXTENSIONS <bool>]
        [RUN_OUTPUT_VARIABLE <var>]
        [RUN_OUTPUT_STDOUT_VARIABLE <var>]
        [RUN_OUTPUT_STDERR_VARIABLE <var>]
        [WORKING_DIRECTORY <var>]
        [ARGS <args>...]
        )

在 3.25 版本中新增。

尝试从一个或多个源文件构建可执行文件。构建成功在 <compileResultVar> 中返回布尔值 true,构建失败返回布尔值 false(除非指定了 NO_CACHE,否则缓存)。如果构建成功,这将运行可执行文件并将退出代码存储在 <runResultVar> 中(除非指定了 NO_CACHE,否则缓存)。如果可执行文件已构建但运行失败,则 <runResultVar> 将设置为 FAILED_TO_RUN。有关这两个命令的通用选项的文档,以及有关如何构建测试项目以构建源文件的信息,请参阅命令 try_compile()

必须提供一个或多个源文件。此外,SOURCES 和/或 SOURCE_FROM_* 必须在其他关键字之前。

3.26 版本新增: 如果未指定 NO_LOG 选项,此命令会记录一个 configure-log try_run 事件

此命令支持 CMake 3.25 之前版本的替代签名。为了清晰起见,建议使用上面的签名。

try_run(<runResultVar> <compileResultVar>
        <bindir> <srcfile|SOURCES srcfile...>
        [CMAKE_FLAGS <flags>...]
        [COMPILE_DEFINITIONS <defs>...]
        [LINK_OPTIONS <options>...]
        [LINK_LIBRARIES <libs>...]
        [LINKER_LANGUAGE <lang>]
        [COMPILE_OUTPUT_VARIABLE <var>]
        [COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
        [<LANG>_STANDARD <std>]
        [<LANG>_STANDARD_REQUIRED <bool>]
        [<LANG>_EXTENSIONS <bool>]
        [RUN_OUTPUT_VARIABLE <var>]
        [OUTPUT_VARIABLE <var>]
        [WORKING_DIRECTORY <var>]
        [ARGS <args>...]
        )

选项

特定于 try_run 的选项是

COMPILE_OUTPUT_VARIABLE <var>

在给定变量中报告编译步骤的构建输出。

OUTPUT_VARIABLE <var>

在给定变量中报告编译构建输出和运行可执行文件的输出。此选项出于历史原因而存在,仅受旧的 try_run 签名支持。请改用 COMPILE_OUTPUT_VARIABLERUN_OUTPUT_VARIABLE

RUN_OUTPUT_VARIABLE <var>

在给定变量中报告运行可执行文件的输出。

RUN_OUTPUT_STDOUT_VARIABLE <var>

在 3.25 版本中新增。

在给定变量中报告运行可执行文件的标准输出。

RUN_OUTPUT_STDERR_VARIABLE <var>

在 3.25 版本中新增。

在给定变量中报告运行可执行文件的标准错误输出。

WORKING_DIRECTORY <var>

在 3.20 版本中添加。

在给定目录中运行可执行文件。如果未指定 WORKING_DIRECTORY,可执行文件将在 <bindir> 或当前构建目录中运行。

ARGS <args>...

运行可执行文件时要传递给可执行文件的额外参数。

其他行为设置

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

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

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

交叉编译时的行为

3.3 版本新增: 运行交叉编译的二进制文件时使用 CMAKE_CROSSCOMPILING_EMULATOR

交叉编译时,第一步编译的可执行文件通常无法在构建主机上运行。try_run 命令检查 CMAKE_CROSSCOMPILING 变量以检测 CMake 是否处于交叉编译模式。如果是这种情况,它仍会尝试编译可执行文件,但除非设置了 CMAKE_CROSSCOMPILING_EMULATOR 变量,否则它不会尝试运行可执行文件。相反,它将创建缓存变量,用户或通过在某些 CMake 脚本文件中预设这些变量,以设置可执行文件在其实际目标平台上运行时会产生的值。这些缓存条目是

<runResultVar>

如果可执行文件将在目标平台上运行,则其退出代码。

<runResultVar>__TRYRUN_OUTPUT

如果可执行文件将在目标平台上运行,则其标准输出和标准错误输出。仅当使用了 RUN_OUTPUT_VARIABLEOUTPUT_VARIABLE 选项时才创建此变量。

为了更容易地交叉编译您的项目,请仅在真正需要时才使用 try_run。如果您使用 try_run,请仅在真正需要时才使用 RUN_OUTPUT_STDOUT_VARIABLERUN_OUTPUT_STDERR_VARIABLERUN_OUTPUT_VARIABLEOUTPUT_VARIABLE 选项。使用它们将要求在交叉编译时手动设置缓存变量为可执行文件的输出。您还可以使用 if() 块检查 CMAKE_CROSSCOMPILING 变量来“保护”对 try_run 的调用,并为这种情况提供一个易于预设的替代方案。