CMD#30:find_library 查找一個庫文件
find_library(<VAR> name1 [path1 path2 ...])
這是該命令的簡寫版本,在大多數場合下都已經夠用了。它與命令find_library(<VAR> name1 [PATHS path1 path2 ...])等價。
find_library(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
該命令用來查找一個庫文件。一個名為<VAR>的cache條目會被創建來存儲該命令的結果。如果找到了該庫文件,那么結果會存儲在該變量里,並且搜索過程將不再重復,除非該變量被清空。如果沒有找到,結果變量將會是<VAR>-NOTFOUND,並且在下次使用相同變量調用find_library命令時,搜索過程會再次嘗試。在NAMES參數后列出的文件名是要被搜索的庫名。附加的搜索位置在PATHS參數后指定。如果再HINTS或者PATHS字段中設置了ENV變量var,環境變量var將會被讀取並從系統環境變量轉換為一個cmake風格的路徑list。例如,指定ENV PATH是獲取系統path變量並將其轉換為cmake的list的一種方式。在DOC之后的參數用來作為cache中的注釋字符串。PATH_SUFFIXES選項指定了每個搜索路徑下待搜索的子路徑。
如果指定了NO_DEFAULT_PATH選項,那么搜索的過程中不會有其他的附加路徑。如果沒有指定該選項,搜索過程如下:
1、搜索cmake特有的cache變量指定的路徑。這些變量是在用cmake命令行時,通過-DVAR=value指定的變量。如果指定了NO_CMAKE_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_LIBRARY_PATH
CMAKE_FRAMEWORK_PATH
2、搜索cmake特有的環境變量指定的路徑。這些變量是用戶的shell配置中設置的變量。如果指定了NO_CMAKE_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_LIBRARY_PATH
CMAKE_FRAMEWORK_PATH
3、搜索由HINTS選項指定的路徑。這些路徑是系統內省(introspection)估算出的路徑,比如由另一個已經發現的庫文件的地址提供的參考信息。硬編碼的推薦路徑應該通過PATHS選項指定。
4、查找標准的系統環境變量。如果指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
PATH
LIB
5、查找在為當前系統的平台文件中定義的cmake變量。如果指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。搜索的路徑還包括:
對於每個在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_SYSTEM_LIBRARY_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
6、搜索PATHS選項或者精簡版命令指定的路徑。這些通常是硬編碼的推薦搜索路徑。
在Darwin或者支持OS X 框架的系統上,cmake變量CMAKE_FIND_FRAMEWORK可以用來設置為空,或者下述值之一:
"FIRST" - 在標准庫或頭文件之前查找框架。在Darwin系統上這是默認選項。
"LAST" - 在標准庫或頭文件之后查找框架。
"ONLY" - 僅僅查找框架。
"NEVER" - 從不查找框架。
在Darwin或者支持OS X Application Bundles的系統,cmake變量CMAKE_FIND_APPBUNDLE可以被設置為空或者下面這些值中的一個:
"FIRST" - 在標准庫或頭文件之前查找application bundles。在Darwin系統上這是默認選項。
"LAST" - 在標准庫或頭文件之后查找application bundles。
"ONLY" - 僅僅查找application bundles。
"NEVER" - 從不查找application bundles。
CMake變量CMAKE_FIND_ROOT_PATH指定了一個或者多個優先於其他搜索路徑的搜索路徑。該變量能夠有效地重新定位在給定位置下進行搜索的根路徑。該變量默認為空。當使用交叉編譯時,該變量十分有用:用該變量指向目標環境的根目錄,然后CMake將會在那里查找。默認情況下,在CMAKE_FIND_ROOT_PATH中列出的路徑會首先被搜索,然后是“非根”路徑。該默認規則可以通過設置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY做出調整。在每次調用該命令之前,都可以通過設置這個變量來手動覆蓋默認行為。如果使用了NO_CMAKE_FIND_ROOT_PATH變量,那么只有重定位的路徑會被搜索。
默認的搜索順序的設計邏輯是按照使用時從最具體到最不具體。通過多次調用find_library命令以及NO_*選項,可以覆蓋工程的這個默認順序:
find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_library(<VAR> NAMES name)
只要這些調用中的一個成功返回,結果變量就會被設置並且被存儲到cache中;這樣隨后的調用都不會再行搜索。如果那找到的庫是一個框架,VAR將會被設置為指向框架“<完整路徑>/A.framework” 的完整路徑。當一個指向框架的完整路徑被用作一個庫文件,CMake將使用-framework A,以及-F<完整路徑>這兩個選項將框架連接到目標上。
