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> 以建置特定目標,而不是 allALL_BUILD 目標。請參閱下方以了解其他選項的含義。

Changed in version 3.24: 在 3.24 版本中變更:描述平台設定的 CMake 變數,以及 CMAKE_TRY_COMPILE_PLATFORM_VARIABLES 變數列出的那些變數,會傳播到專案的建置配置中。請參閱政策 CMP0137。先前這僅由 原始檔 簽章完成。

Added in version 3.26: 在 3.26 版本中新增:如果未指定 NO_LOG 選項,此命令會記錄 configure-log try_compile 事件

Added in version 3.30: 在 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 以避免此清除。但是,如果給定相同的 <bindir>,多個連續的 try_compile 操作將重複使用這個單一的輸出目錄,這樣您一次只能偵錯一個 try_compile 呼叫。建議使用較新的簽章來簡化多個 try_compile 操作的偵錯。

選項

上述簽章的選項為

CMAKE_FLAGS <flags>...

指定 -DVAR:TYPE=VALUE 形式的旗標,以傳遞給用於驅動測試建置的 cmake(1) 命令列。上面的範例示範了如何使用變數 COMPILE_DEFINITIONSINCLUDE_DIRECTORIESLINK_DIRECTORIESLINK_LIBRARIESLINK_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=... 值都將被忽略。

Added in version 3.29: 在 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_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_MODULESFILE_SET

原始碼的預設類型為 NORMAL

<LANG>_STANDARD <std>

在 3.8 版本中新增。

指定產生的專案的 C_STANDARDCXX_STANDARDOBJC_STANDARDOBJCXX_STANDARDCUDA_STANDARD 目標屬性。

<LANG>_STANDARD_REQUIRED <bool>

在 3.8 版本中新增。

指定產生的專案的 C_STANDARD_REQUIREDCXX_STANDARD_REQUIREDOBJC_STANDARD_REQUIREDOBJCXX_STANDARD_REQUIREDCUDA_STANDARD_REQUIRED 目標屬性。

<LANG>_EXTENSIONS <bool>

在 3.8 版本中新增。

指定產生的專案的 C_EXTENSIONSCXX_EXTENSIONSOBJC_EXTENSIONSOBJCXX_EXTENSIONSCUDA_EXTENSIONS 目標屬性。

其他行為設定

Added in version 3.4: 在 3.4 版本中新增:如果設定,則會將以下變數傳遞到產生的 try_compile CMakeLists.txt 中,以使用預設值初始化編譯目標屬性

Changed in version 3.14: 在 3.14 版本中變更:如果 CMP0083 設定為 NEW,那麼為了在連結時獲得正確的行為,必須在使用 try_compile 命令之前呼叫來自 CheckPIESupported 模組的 check_pie_supported() 命令。

某些政策會根據需要在產生的測試專案中自動設定,以符合呼叫專案的狀態

Added in version 4.0: 在 4.0 版本中新增:CMP0181 政策的目前設定會傳播到產生的測試專案。

設定變數 CMAKE_TRY_COMPILE_CONFIGURATION 以選擇建置配置

  • 對於多配置產生器,這會選擇要建置的配置。

  • 對於單配置產生器,這會在測試專案中設定 CMAKE_BUILD_TYPE

Added in version 3.6: 在 3.6 版本中新增:設定 CMAKE_TRY_COMPILE_TARGET_TYPE 變數,以指定用於原始檔簽章的目標類型。

Added in version 3.6: 在 3.6 版本中新增:設定 CMAKE_TRY_COMPILE_PLATFORM_VARIABLES 變數,以指定必須傳播到測試專案中的變數。此變數僅供工具鏈檔案中使用,並且僅在原始檔形式的 try_compile() 命令中才有效,而不適用於給定完整專案的情況。

Changed in version 3.8: 在 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 執行階段檢查。

參見