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>])
在 3.25 版本中新增。
尝试构建一个项目。构建成功则在 <compileResultVar> 中返回 TRUE,构建失败则返回 FALSE。
在这种形式下,<srcdir> 应该包含一个完整的 CMake 项目,其中有一个 CMakeLists.txt 文件和所有源文件。<bindir> 和 <srcdir> 在命令执行后不会被删除。指定 <targetName> 可以构建一个特定的目标,而不是 all 或 ALL_BUILD 目标。其他选项的含义请参见下文。
版本 3.24 已更改: 描述平台设置的 CMake 变量,以及 CMAKE_TRY_COMPILE_PLATFORM_VARIABLES 变量列出的变量,都会被传播到项目的构建配置中。请参见策略 CMP0137。在此之前,这仅通过 源文件 签名完成。
版本 3.26 已添加: 如果未指定 NO_LOG 选项,此命令将记录一个 configure-log try_compile 事件。
版本 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>]
)
在 3.25 版本中新增。
尝试从一个或多个源文件构建可执行文件或静态库。二进制类型由变量 CMAKE_TRY_COMPILE_TARGET_TYPE 确定。构建成功则在 <compileResultVar> 中返回布尔值 true,构建失败则返回布尔值 false(除非指定了 NO_CACHE,否则会缓存)。
在这种形式下,必须提供一个或多个源文件。此外,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 以避免此清理。然而,多个连续的 try_compile 操作,如果使用相同的 <bindir>,将重用此单个输出目录,因此您一次只能调试一个此类 try_compile 调用。建议使用较新的签名以简化多个 try_compile 操作的调试。
选项¶
上述签名的选项是:
CMAKE_FLAGS <flags>...指定
-DVAR:TYPE=VALUE形式的标志,以传递给用于驱动测试构建的cmake(1)命令。上面的示例展示了如何使用变量COMPILE_DEFINITIONS、INCLUDE_DIRECTORIES、LINK_DIRECTORIES、LINK_LIBRARIES和LINK_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在 3.25 版本中新增。
<compileResultVar>将存储在普通变量中,而不是缓存条目中。<compileResultVar>通常会被缓存,以便使用一个简单的模式来避免在后续 CMake 执行中重复测试。if(NOT DEFINED RESULTVAR) # ...(check-specific setup code)... try_compile(RESULTVAR ...) # ...(check-specific logging and cleanup code)... endif()
如果保护变量和结果变量不同(例如,如果测试是更大检查的一部分),则
NO_CACHE可能有助于避免将中间结果变量泄露到缓存中。NO_LOG3.26 版新增。
不要为此调用记录
cmake-configure-log(7)条目。OUTPUT_VARIABLE <var>将构建过程的输出存储在指定的变量中。
SOURCE_FROM_CONTENT <name> <content>在 3.25 版本中新增。
将
<content>写入操作目录中的名为<name>的文件。当文件的内容是动态指定时,这可以绕过单独写入源文件的需要。指定的<name>不允许包含路径组件。SOURCE_FROM_CONTENT可以指定多次。SOURCE_FROM_FILE <name> <path>在 3.25 版本中新增。
将
<path>复制到操作目录中名为<name>的文件。这可以用于将文件合并到操作目录中,这在需要引用由SOURCE_FROM_*创建的其他文件时(例如,一个已存在的独立文件在项目源代码仓库中)很有用。(否则,SOURCES通常更方便。)指定的<name>不允许包含路径组件。SOURCE_FROM_VAR <name> <var>在 3.25 版本中新增。
将变量
<var>的内容写入操作目录中名为<name>的文件。这与SOURCE_FROM_CONTENT相同,但内容来自指定的 CMake 变量,而不是直接指定,这在通过包装try_compile的函数传递参数时可能很有用。指定的<name>不允许包含路径组件。SOURCE_FROM_VAR可以指定多次。SOURCES_TYPE <type>版本 3.28 新增。
源文件可以使用
SOURCES_TYPE参数进行分类。指定后,所有后续指定的源文件都将以此类型处理,直到再次指定SOURCES_TYPE。可用类型为:NORMAL源文件不会添加到生成项目中的任何
FILE_SET。CXX_MODULE版本 3.28 新增。
源文件将添加到生成项目中的
CXX_MODULES类型的FILE_SET中。
源文件的默认类型为
NORMAL。<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 以初始化编译目标属性的默认值:
版本 3.14 已更改: 如果 CMP0083 设置为 NEW,则为了在链接时获得正确的行为,必须先调用 CheckPIESupported 模块中的 check_pie_supported() 命令,然后才能使用 try_compile 命令。
一些策略会自动在生成的测试项目中设置,以响应调用项目的状态。
CMP0065(在 CMake 4.0 及更早版本中)
版本 4.0 已添加: 策略 CMP0181 的当前设置将传播到生成的测试项目中。
设置变量 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 将被传播到测试项目的构建配置中。
版本 4.0 已添加: 如果 CMP0184 设置为 NEW,可以使用 CMAKE_MSVC_RUNTIME_CHECKS 来指定启用的 MSVC 运行时检查。