find package 的底層執行機制

2021-10-06 17:57:37 字數 1900 閱讀 2797

馬斯克的龍飛船中的作業系統是linux,軟體工程使用的是c++,用gcc和gdb去除錯**,c++如此強大和靈活,所以有必要了解一下c++工程是如何make的.

我們在寫cmakelists.txt時候需要查詢第三方庫的標頭檔案和庫檔案,通常直接是執行

find_package(***)
然後就會有對應的

$和$
如果find_package(***)失敗的話,就不會生成這兩個環境變數.

這裡講一下這兩個環境變數是怎麼產生的.

module模式:搜尋cmake_module_path指定路徑下的find***.cmake檔案,執行該檔案從而找到***庫。其中,具體查詢庫並給***_include_dirs和***_libraries兩個變數賦值的操作由find***.cmake模組完成。

config模式:搜尋***_dir指定路徑下的***config.cmake檔案,執行該檔案從而找到***庫。其中具體查詢庫並給***_include_dirs和***_libraries兩個變數賦值的操作由***config.cmake模組完成。

cmake_binary_dir

project_binary_dir 

_binary_dir

cmake_binary_dir

這三個變數指代的內容是一致的,如果是 in source 編譯,指的就是工程頂層目錄,如果是 out-of-source 編譯,指的是工程編譯發生的目錄。

cmake_module_path

這個變數用來定義自己的 cmake 模組所在的路徑。如果你的工程比較複雜,有可能會自己編寫一些 cmake 模組,這些 cmake 模組是隨你的工程發布的,為了讓 cmake 在處理cmakelists.txt 時找到這些模組,你需要通過 set 指令,將自己的 cmake 模組路徑設定一下。

比如

set(cmake_module_path $/cmake)
這時候你就可以通過 include 指令來呼叫自己的模組了。

cmake_source_dir

project_source_dir

_source_dir

cmake_source_dir

這三個變數指代的內容是一致的,不論採用何種編譯方式,都是工程頂層目錄。

也就是在 in source 編譯時,他跟 cmake_binary_dir 等變數一致。

project_source_dir 跟其他指令稍有區別,現在,你可以理解為他們是一致的。

cmake_current_source_dir

指的是當前處理的 cmakelists.txt 所在的路徑,比如上面我們提到的 src 子目錄。

cmake_currrent_binary_dir

如果是 in-source 編譯,它跟 make_current_source_dir 一致,如果是 out-of-source 編譯,他指的是 target 編譯目錄。

使用我們上面提到的 add_subdirectory(src bin)可以更改這個變數的值。

使用 set(executable_output_path 《新路徑》)並不會對這個變數造成影響,它僅僅修改了最終目標檔案存放的路徑。

cmake_current_list_file

輸出呼叫這個變數的 cmakelists.txt 的完整路徑

cmake_current_list_line

輸出這個變數所在的行

executable_output_path 和 library_output_path

分別用來重新定義最終結果的存放目錄,前面我們已經提到了這兩個變數。

project_name

返回通過 project 指令定義的專案名稱。

Cmake中的find package功能

find package其實在windows下扮演的角色並不是很重要。在unix下就非常重要了,find package可以根據cmake內建的.cmake的指令碼去找相應的庫的模組,當然,內建了很多庫的模組變數,呼叫了find package之後,會有相應的變數 生成 有效。比如呼叫了find p...

底層框架 BSN如何適配不同的底層框架?

而目前,我們看到區塊鏈服務網路 bsn 作為乙個跨雲服務 跨門戶 跨底層框架的全球性公共基礎設施網路,其支援的所有底層框架在金鑰演算法 sdk ca 管理和各方面證書等機制都做了統一,可以讓執行在不同底層框架上的應用相對比較簡單地實現業務資料的互通。為此,infoq 採訪了微眾銀行區塊鏈高階架構師周...

C 的底層機制

c 為我們所提供的各種訪問控制僅僅是在編譯階段給我們的限制,也就是說是編譯器確保了你在完成任務之前的正確行為,如果你的行為不正確,那麼你休想構造出任何可執行程式來。但如果真正到了產生可執行 階段,無論是c,c 還是pascal,大家都一樣,你認為c和c 編譯器產生的機器 會有所不同嗎,你 認為c 產...