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
目標。請參閱下方以了解其他選項的含義。
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_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=...
值都將被忽略。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_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
目標屬性。
其他行為設定¶
Added in version 3.4: 在 3.4 版本中新增:如果設定,則會將以下變數傳遞到產生的 try_compile CMakeLists.txt 中,以使用預設值初始化編譯目標屬性
CMAKE_EXE_LINKER_FLAGS
, unless using CMake versions prior to 4.0 without policyCMP0056
set toNEW
Changed in version 3.14: 在 3.14 版本中變更:如果 CMP0083
設定為 NEW
,那麼為了在連結時獲得正確的行為,必須在使用 try_compile
命令之前呼叫來自 CheckPIESupported
模組的 check_pie_supported()
命令。
某些政策會根據需要在產生的測試專案中自動設定,以符合呼叫專案的狀態
CMP0065
(在 CMake 4.0 之前的版本中)
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 執行階段檢查。