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_VARIABLE
和RUN_OUTPUT_VARIABLE
。RUN_OUTPUT_VARIABLE <var>
在给定的变量中报告运行可执行文件的输出。
RUN_OUTPUT_STDOUT_VARIABLE <var>
在 3.25 版本中添加。
在给定的变量中报告运行可执行文件的 stdout 输出。
RUN_OUTPUT_STDERR_VARIABLE <var>
在 3.25 版本中添加。
在给定的变量中报告运行可执行文件的 stderr 输出。
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
如果可执行文件要在目标平台上运行,则为来自 stdout 和 stderr 的输出。仅当使用
RUN_OUTPUT_VARIABLE
或OUTPUT_VARIABLE
选项时才会创建此项。
为了使交叉编译项目更容易,请仅在真正需要时才使用 try_run
。如果使用 try_run
,请仅在真正需要时才使用 RUN_OUTPUT_STDOUT_VARIABLE
、RUN_OUTPUT_STDERR_VARIABLE
、RUN_OUTPUT_VARIABLE
或 OUTPUT_VARIABLE
选项。使用它们将需要在交叉编译时手动将缓存变量设置为可执行文件的输出。您还可以使用 if()
块“保护”对 try_run
的调用,检查 CMAKE_CROSSCOMPILING
变量,并为此情况提供易于预设的替代方案。