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> 應包含具有 CMakeLists.txt 檔案和所有原始碼的完整 CMake 專案。執行此命令後,<bindir><srcdir> 不會被刪除。指定 <targetName> 以建置特定目標,而不是 allALL_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

在此形式中,必須提供一或多個原始碼檔案。此外,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=... 值。

在版本 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 中新增。

結果將儲存在一般變數中,而不是快取條目中。

結果變數通常會被快取,以便可以使用簡單的模式來避免在後續執行 CMake 時重複測試。

if(NOT DEFINED RESULTVAR)
  # ...(check-specific setup code)...
  try_compile(RESULTVAR ...)
  # ...(check-specific logging and cleanup code)...
endif()

如果 guard 變數和結果變數不同(例如,如果測試是較大檢查的一部分),則 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 目標屬性。

其他行為設定

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

如果 CMP0056 設定為 NEW,則也會傳遞 CMAKE_EXE_LINKER_FLAGS

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

CMP0065CMP0083 的目前設定會傳播到產生的測試專案。

設定變數 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 會傳播到測試專案的建置組態中。

參見