find_library

簡短的簽名是

find_library (<VAR> name1 [path1 path2 ...])

一般的簽名是

find_library (
          <VAR>
          name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
          [HINTS [path | ENV var]...]
          [PATHS [path | ENV var]...]
          [REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
          [PATH_SUFFIXES suffix1 [suffix2 ...]]
          [VALIDATOR function]
          [DOC "cache documentation string"]
          [NO_CACHE]
          [REQUIRED]
          [NO_DEFAULT_PATH]
          [NO_PACKAGE_ROOT_PATH]
          [NO_CMAKE_PATH]
          [NO_CMAKE_ENVIRONMENT_PATH]
          [NO_SYSTEM_ENVIRONMENT_PATH]
          [NO_CMAKE_SYSTEM_PATH]
          [NO_CMAKE_INSTALL_PREFIX]
          [CMAKE_FIND_ROOT_PATH_BOTH |
           ONLY_CMAKE_FIND_ROOT_PATH |
           NO_CMAKE_FIND_ROOT_PATH]
         )

此命令用於尋找程式庫。一個快取條目,或者如果指定了 NO_CACHE 則是一個普通變數,以 <VAR> 命名,被建立來儲存此命令的結果。如果找到程式庫,結果會儲存在變數中,並且除非變數被清除,否則不會重複搜尋。如果沒有找到任何東西,結果將會是 <VAR>-NOTFOUND

選項包含

NAMES

指定一個或多個可能的程式庫名稱。

當使用此選項來指定帶有和不帶有版本後綴的名稱時,我們建議首先指定不帶版本的名稱,以便可以先找到本地建置的套件,然後再找到發行版提供的套件。

HINTSPATHS

指定除了預設位置之外要搜尋的目錄。ENV var 子選項從系統環境變數讀取路徑。

在 3.24 版本變更: Windows 平台上,可以將登錄查詢包含在目錄中,使用專用語法。此類規範將在所有其他平台上被忽略。

REGISTRY_VIEW

在 3.24 版本新增。

指定必須查詢哪個登錄檢視。此選項僅在 Windows 平台上才有意義,在其他平台上將被忽略。未指定時,當 CMP0134 政策為 NEW 時,會使用 TARGET 檢視。有關政策為 OLD 時的預設檢視,請參閱 CMP0134

64

查詢 64 位元登錄檔。在 32 位元 Windows 上,它總是傳回字串 /REGISTRY-NOTFOUND

32

查詢 32 位元登錄檔。

64_32

查詢兩個檢視(6432)並為每個檢視產生一個路徑。

32_64

查詢兩個檢視(3264)並為每個檢視產生一個路徑。

HOST

查詢與主機架構相符的登錄檔:在 64 位元 Windows 上為 64,在 32 位元 Windows 上為 32

TARGET

查詢與 CMAKE_SIZEOF_VOID_P 變數指定的架構相符的登錄檔。如果未定義,則回退到 HOST 檢視。

BOTH

查詢兩個檢視(3264)。順序取決於以下規則:如果定義了 CMAKE_SIZEOF_VOID_P 變數,則根據此變數的內容使用以下檢視

  • 8: 64_32

  • 4: 32_64

如果未定義 CMAKE_SIZEOF_VOID_P 變數,則依賴主機的架構

  • 64 位元:64_32

  • 32 位元:32

PATH_SUFFIXES

指定要在每個目錄位置下方檢查的其他子目錄,否則將會被考慮。

VALIDATOR

在 3.25 版本新增。

指定一個 function(),對於找到的每個候選項目(macro() 無法提供,否則會導致錯誤)調用。兩個參數將會傳遞給驗證器函數:結果變數的名稱,以及候選項目的絕對路徑。除非函數在調用範圍中將結果變數中的值設定為 false,否則該項目將被接受,並且搜尋將會結束。當輸入驗證器函數時,結果變數將會保存 true 值。

function(my_check validator_result_var item)
  if(NOT item MATCHES ...)
    set(${validator_result_var} FALSE PARENT_SCOPE)
  endif()
endfunction()

find_library (result NAMES ... VALIDATOR my_check)

請注意,如果使用了快取結果,則會跳過搜尋,並且任何 VALIDATOR 都會被忽略。快取結果不需要通過驗證函數。

DOC

指定 <VAR> 快取條目的文件字串。

NO_CACHE

在 3.21 版本新增。

搜尋結果將會儲存在普通變數中,而不是快取條目中。

注意

如果在調用之前已經設定了變數(作為普通變數或快取變數),則不會進行搜尋。

警告

應謹慎使用此選項,因為它可能會大大增加重複配置步驟的成本。

REQUIRED

在 3.18 版本新增。

如果找不到任何東西,則停止處理並顯示錯誤訊息,否則下次使用相同的變數調用 find_library 時,將會再次嘗試搜尋。

如果指定了 NO_DEFAULT_PATH,則不會將其他路徑新增到搜尋中。如果未指定 NO_DEFAULT_PATH,則搜尋過程如下

  1. 如果從 find 模組或透過調用 find_package(<PackageName>) 載入的任何其他腳本中調用,則搜尋當前正在尋找的套件的唯一前綴。請參閱政策 CMP0074

    在 3.12 版本新增。

    具體來說,依序搜尋以下變數指定的路徑

    1. <PackageName>_ROOT CMake 變數,其中 <PackageName> 是區分大小寫的套件名稱。

    2. <PACKAGENAME>_ROOT CMake 變數,其中 <PACKAGENAME> 是大寫的套件名稱。請參閱政策 CMP0144

      在 3.27 版本新增。

    3. <PackageName>_ROOT 環境變數,其中 <PackageName> 是區分大小寫的套件名稱。

    4. <PACKAGENAME>_ROOT 環境變數,其中 <PACKAGENAME> 是大寫的套件名稱。請參閱政策 CMP0144

      在 3.27 版本新增。

    套件根變數維護為堆疊,因此如果從巢狀 find 模組或配置套件中調用,則會在搜尋當前模組或套件的路徑之後,搜尋父級 find 模組或配置套件的根路徑。換句話說,搜尋順序將為 <CurrentPackage>_ROOTENV{<CurrentPackage>_ROOT}<ParentPackage>_ROOTENV{<ParentPackage>_ROOT} 等。如果傳遞了 NO_PACKAGE_ROOT_PATH,或者將 CMAKE_FIND_USE_PACKAGE_ROOT_PATH 設定為 FALSE,則可以跳過此步驟。

  2. 在 cmake 專用快取變數中指定的搜尋路徑。這些旨在透過 -DVAR=value 在命令列上使用。這些值被解釋為 分號分隔的列表。如果傳遞了 NO_CMAKE_PATH,或者將 CMAKE_FIND_USE_CMAKE_PATH 設定為 FALSE,則可以跳過此步驟。

  3. 在 cmake 專用環境變數中指定的搜尋路徑。這些旨在在使用者的 shell 配置中設定,因此使用主機的原生路徑分隔符號(Windows 上為 ;,UNIX 上為 :)。如果傳遞了 NO_CMAKE_ENVIRONMENT_PATH,或者將 CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH 設定為 FALSE,則可以跳過此步驟。

  4. 搜尋 HINTS 選項指定的路徑。這些應該是透過系統內省計算的路徑,例如已找到的另一個項目的位置提供的提示。硬編碼的猜測應使用 PATHS 選項指定。

  5. 搜尋標準系統環境變數。如果傳遞了 NO_SYSTEM_ENVIRONMENT_PATH,或者將 CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH 設定為 FALSE,則可以跳過此步驟。

    • LIBPATH 中的目錄。

    在 Windows 主機上,CMake 3.3 到 3.27 搜尋了其他路徑:如果設定了 CMAKE_LIBRARY_ARCHITECTURE,則為 <prefix>/lib/<arch>,以及對於 PATH 中的每個 <prefix>/[s]bin,則為 <prefix>/lib,以及對於 PATH 中的其他條目,則為 <entry>/lib。此行為已在 CMake 3.28 中移除。

  6. 搜尋在目前系統的平台檔案中定義的 cmake 變數。如果傳遞了 NO_CMAKE_INSTALL_PREFIX,或者將 CMAKE_FIND_USE_INSTALL_PREFIX 設定為 FALSE,則可以跳過搜尋 CMAKE_INSTALL_PREFIXCMAKE_STAGING_PREFIX。如果傳遞了 NO_CMAKE_SYSTEM_PATH,或者將 CMAKE_FIND_USE_CMAKE_SYSTEM_PATH 設定為 FALSE,則可以跳過所有這些位置。

    這些變數包含的平台路徑是通常包含已安裝軟體的位置。例如,UNIX 平台為 /usr/local

  7. 搜尋 PATHS 選項或命令的簡短版本中指定的路徑。這些通常是硬編碼的猜測。

CMAKE_IGNORE_PATHCMAKE_IGNORE_PREFIX_PATHCMAKE_SYSTEM_IGNORE_PATHCMAKE_SYSTEM_IGNORE_PREFIX_PATH 變數也可能導致忽略上述某些位置。

在 3.16 版本新增: 新增 CMAKE_FIND_USE_<CATEGORY>_PATH 變數以全域停用各種搜尋位置。

在 macOS 上,CMAKE_FIND_FRAMEWORKCMAKE_FIND_APPBUNDLE 變數決定了 Apple 風格和 unix 風格套件元件之間的偏好順序。

CMake 變數 CMAKE_FIND_ROOT_PATH 指定一個或多個要前置到所有其他搜尋目錄的目錄。這有效地將整個搜尋「重新植根」在給定的位置下。作為 CMAKE_STAGING_PREFIX 後代的路徑將從此重新植根中排除,因為該變數始終是主機系統上的路徑。預設情況下,CMAKE_FIND_ROOT_PATH 為空。

CMAKE_SYSROOT 變數也可以用於指定確切的一個目錄作為前綴。設定 CMAKE_SYSROOT 也具有其他效果。有關更多資訊,請參閱該變數的文件。

當交叉編譯以指向目標環境的根目錄時,這些變數特別有用,CMake 也會在該處搜尋。預設情況下,首先搜尋 CMAKE_FIND_ROOT_PATH 中列出的目錄,然後搜尋 CMAKE_SYSROOT 目錄,然後搜尋非根目錄。預設行為可以透過設定 CMAKE_FIND_ROOT_PATH_MODE_LIBRARY 來調整。可以使用以下選項在每次調用的基礎上手動覆寫此行為

CMAKE_FIND_ROOT_PATH_BOTH

按照上述順序搜尋。

NO_CMAKE_FIND_ROOT_PATH

不使用 CMAKE_FIND_ROOT_PATH 變數。

ONLY_CMAKE_FIND_ROOT_PATH

僅搜尋重新植根的目錄和 CMAKE_STAGING_PREFIX 下方的目錄。

預設搜尋順序旨在對於常見用例而言,從最特定到最不特定。專案可以透過簡單地多次調用命令並使用 NO_* 選項來覆寫順序

find_library (<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_library (<VAR> NAMES name)

一旦其中一個調用成功,結果變數將會被設定並儲存在快取中,以便沒有調用會再次搜尋。

當為 NAMES 選項提供多個值時,此命令預設會一次考慮一個名稱,並在每個目錄中搜尋它。NAMES_PER_DIR 選項告訴此命令一次考慮一個目錄,並在其中搜尋所有名稱。

提供給 NAMES 選項的每個程式庫名稱首先會按原樣考慮,如果它包含程式庫後綴,然後會考慮帶有平台特定前綴(例如 lib)和後綴(例如 .so),由變數 CMAKE_FIND_LIBRARY_PREFIXESCMAKE_FIND_LIBRARY_SUFFIXES 定義。因此,可以指定程式庫檔案名稱,例如直接指定 libfoo.a。這可以用於在類 UNIX 系統上定位靜態程式庫。

如果找到的程式庫是框架,則 <VAR> 將被設定為框架的完整路徑 <fullPath>/A.framework。當框架的完整路徑用作程式庫時,CMake 將使用 -framework A-F<fullPath> 將框架連結到目標。

在 3.28 版本新增: 找到的程式庫現在可以是 .xcframework 資料夾。

如果設定了 CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX 變數,則所有搜尋路徑都將像往常一樣進行測試,附加後綴,並且所有 lib/ 的匹配項都將替換為 lib${CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX}/。此變數會覆寫 FIND_LIBRARY_USE_LIB32_PATHSFIND_LIBRARY_USE_LIBX32_PATHSFIND_LIBRARY_USE_LIB64_PATHS 全域屬性。

如果設定了 FIND_LIBRARY_USE_LIB32_PATHS 全域屬性,則所有搜尋路徑都將像往常一樣進行測試,附加 32/,並且所有 lib/ 的匹配項都將替換為 lib32/。如果 project() 命令支援的語言中至少啟用了一種語言,則會自動為已知需要它的平台設定此屬性。

如果設定了 FIND_LIBRARY_USE_LIBX32_PATHS 全域屬性,則所有搜尋路徑都將像往常一樣進行測試,附加 x32/,並且所有 lib/ 的匹配項都將替換為 libx32/。如果 project() 命令支援的語言中至少啟用了一種語言,則會自動為已知需要它的平台設定此屬性。

如果設定了 FIND_LIBRARY_USE_LIB64_PATHS 全域屬性,則所有搜尋路徑都將像往常一樣進行測試,附加 64/,並且所有 lib/ 的匹配項都將替換為 lib64/。如果 project() 命令支援的語言中至少啟用了一種語言,則會自動為已知需要它的平台設定此屬性。