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})
对于每个 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 以避免此清理。 但是,如果为多个连续的 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()
,或根据CMAKE_TRY_COMPILE_TARGET_TYPE
变量,在生成的项目中设置STATIC_LIBRARY_OPTIONS
目标属性。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_LOG
在版本 3.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
,则为了在链接时获得正确的行为,必须在使用 try_compile
命令之前调用 CheckPIESupported
模块中的 check_pie_supported()
命令。
某些策略会在生成的测试项目中根据需要自动设置,以遵守调用项目的状态
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 运行时检查。