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>
以建置特定目標,而不是 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
。
在此形式中,必須提供一或多個原始碼檔案。此外,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_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 中新增。
結果將儲存在一般變數中,而不是快取條目中。
結果變數通常會被快取,以便可以使用簡單的模式來避免在後續執行 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_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 中,以使用預設值初始化編譯目標屬性
如果 CMP0056
設定為 NEW
,則也會傳遞 CMAKE_EXE_LINKER_FLAGS
。
在 3.14 版本中變更:如果 CMP0083
設定為 NEW
,那麼為了在連結時獲得正確的行為,必須在使用 try_compile
命令之前呼叫 CheckPIESupported
模組中的 check_pie_supported()
命令。
CMP0065
和 CMP0083
的目前設定會傳播到產生的測試專案。
設定變數 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
會傳播到測試專案的建置組態中。