CMake手冊詳解 (十二)

2021-07-26 05:05:34 字數 2816 閱讀 2477

find_library(name1 [path1 path2 ...])
這是該命令的簡寫版本,在大多數場合下都已經夠用了。它與命令find_library(name1 [paths path1 path2 ...])等價。

find_library(

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]

)

該命令用來查詢乙個庫檔案。乙個名為的cache條目會被建立來儲存該命令的結果。如果找到了該庫檔案,那麼結果會儲存在該變數裡,並且搜尋過程將不再重複,除非該變數被清空。如果沒有找到,結果變數將會是-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中的,路徑/lib 

cmake_library_path

cmake_framework_path

2、搜尋cmake特有的環境變數指定的路徑。這些變數是使用者的shell配置中設定的變數。如果指定了no_cmake_environment_path選項,這些路徑會被跳過。搜尋的路徑還包括:

對於每個在cmake_prefix_path中的,路徑/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中的,路徑/lib 

cmake_system_library_path

cmake_system_framework_path

6、搜尋paths選項或者精簡版命令指定的路徑。這些通常是硬編碼的推薦搜尋路徑。

在darwin或者支援os x 框架的系統上,cmake變數cmake_find_framework可以用來設定為空,或者下述值之一:

"first"  - 在標準庫或標頭檔案之前查詢框架。在darwin系統上這是預設選項。

"last" - 在標準庫或標頭檔案之後查詢框架。

"only" - 僅僅查詢框架。

"never" - 從不查詢框架。

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(names name paths paths... no_default_path)

find_library(names name)

只要這些呼叫中的乙個成功返回,結果變數就會被設定並且被儲存到cache中;這樣隨後的呼叫都不會再行搜尋。如果那找到的庫是乙個框架,var將會被設定為指向框架「《完整路徑》/a.framework」 的完整路徑。當乙個指向框架的完整路徑被用作乙個庫檔案,cmake將使用-framework a,以及-f《完整路徑》這兩個選項將框架連線到目標上。

CMake 手冊詳解(五)

cmd 2 add custom target新增乙個目標,它沒有輸出 這樣它就總是會被構建。add custom target name all command1 args1.command command2 args2.depends depend depend depend working d...

CMake手冊詳解 (九)

cmd 17 else 開始乙個if語句塊的else部分。else expression 參見if命令。cmd 18 elseif 開始if 塊的 elseif 部分。elseif expression 參見if命令。cmd 19 enable language 支援某種語言 cxx c fortr...

CMake 手冊詳解(二十)

cmd 51 list列表操作命令。使用length選項時,該命令會返回給定list的長度。使用get選項時,該命令返回list中所有被index索引的元素構成的list。使用find選項時,該命令將返回list中指定的元素的索引 若果未找到,返回 1。使用insert選項時,該命令將在list中指...