cmake 指定標頭檔案路徑 CMake 小計

2021-10-11 06:45:34 字數 3970 閱讀 4318

cmake 是乙個高效的 c/c++ makefile 生成工具,具有很好的跨平台性。利用它可以讓**在各個平台上順利的編譯。

現在最願意看到的編譯流程就是:

mkdir build

cd build

cmake ..

make

這裡可能不是詳盡的解釋,但是展示了我本人在編寫中常用的命令。 利用 cmake 的契機主要是想要擺脫 xcode 以及使用 clion。當然,也是為自己的一些小專案做管理。(主要是不想寫 makefile)

cmakelist.txt是 cmake 的核心檔案,所有對 cmake 的編輯配置都集中於此。所以,使用 cmake 來管理你的專案核心就在如何編寫cmakelists.txt。 具體參考教程可以檢視參考資料的第一條進行練習。

括號中的是可選項。

cmake_minimum_required(version 3.9)
指定 cmake 的最低版本,非必要,但是最好有,因為可能有相容性問題。

project( projectname )
指明cmakelists.txt目錄是乙個專案,並且專案名為指定的名稱。clion 依靠此命令來識別專案。

set()
設定變數命令,類似**中的變數,可以設定成想要的字串。

find_package([required])
查詢庫的命令。

庫一般會有二進位制檔案以及標頭檔案兩個內容需要查詢。

此命令會以兩種模式尋找庫的資訊。一種以 module 模式查詢,該命令會從cmake_module_path變數儲存的路徑(可以包含多個路徑,以 : 分隔)中查詢格式為find.cmake的檔案,根據包名來載入對應的 cmake 檔案查詢對應的內容。具體路徑可以檢視cmake的查詢目錄結構。

如果載入完成,以下變數就會被設定為對應的查詢路徑:

_found

_include_dir

_libraries

如果上述模式沒有查詢成功,會進入 config 模式,會在提供的 path 中查詢config.cmake或者.pc來讀取配置。如果載入完成,同樣會設定上訴的三個變數。

當然還有更複雜的用法以及更多的變數設定,但是簡單實用的是上面三個。

find_package(pkgconfig required)
載入這個包會載入一些 cmake 命令,從而可以載入由 pkg-config 管理的庫。

載入這個庫後會引用三個命令可供使用:

pkg_search_module()

pkg_check_module()

pkg_get_variable()

主要討論pkg_search_module: 用法如下:

pkg_search_module([比較符 版本號] ...)
可以同時查詢多個庫,繼續往後寫就行。

所有庫都找到以後,一下變數會被設定:

_found          ... set to 1 if module(s) exist

_libraries ... only the libraries (without the '-l')

_link_libraries ... the libraries and their absolute paths

_library_dirs ... the paths of the libraries (without the '-l')

_ldflags ... all required linker flags

_ldflags_other ... all other linker flags

_include_dirs ... the '-i' preprocessor flags (without the '-i')

_cflags ... all required cflags

_cflags_other ... the other compiler flags

可以根據需要選用,用的比較多應該還是一下兩個:

_include_dirs   ... the '-i' preprocessor flags (without the '-i')

_libraries ... only the libraries (without the '-l')

因為 mac 用 brew 安裝一些庫的時候有時並不會包含find***.cmake,但是***.pc是被正確設定了的。使用pkg-config --list-all可以檢視是否成功安裝。
include_directories()
指定標頭檔案的搜尋路徑。外部路徑最好使用<>引用,雖然使用""也沒什麼問題,工程目錄的最好使用""引用。

aux_source_directory()
該命令會搜尋該目錄下的所有原始檔,組織過後全都放在變數中。防止重複修改配置檔案的利器。

add_executable(...)
將多個原始檔編譯鏈結成乙個可執行檔案。這個目錄下的 cmake 檔案的主要目標,可以設定多個可執行檔案。根據需要進行編譯。

target_link_libraries()
將庫與可執行檔案進行鏈結。

add_subdirectory()
這種情況下,path 下也有乙個cmakelists.txt來配置子目錄的行為,子目錄的配置會被載入並將相關的內容新增到當前的配置中。

add_library([static | shared | module] )
用法與add_executable相似,不過根據需求可以選擇生成靜態庫還是共享庫還是模組。

下面是管理乙個小專案的 cmake 模板,可以根據自己的需求進行修改。如果專案更加複雜,cmake 也可像指令碼一樣使用迴圈判斷等功能。玩的開心

cmake_minimum_required(version 3.9)

project(template)

// find_package() 等等

// source dir

aux_source_directory(./src src)

// include path

include_directories(./include)

// cmake config

set(cmake_cxx_standard 11)

// add exec

add_executable($ $)

// link target

//target_link_libraries($ ...)

cmake 入門實戰​www.hahack.com

find_package cmake docs​cmake.org

findpkgconfig - cmake 3.14.3 documentation​cmake.org

CMAKE 預設標頭檔案路徑問題

如果在cmake配置中 include directories home ll home ll中的標頭檔案查詢優先順序高於系統預設目錄 usr include和 usr local include 即使增加 系統預設的搜尋標頭檔案的目錄隨選擇的c c 編譯器而變化 交叉編譯例項 cmake mini...

CMake學習 新增標頭檔案路徑,庫路徑,庫

cmake中,新增標頭檔案路徑,對應的函式叫include directories。然後在引數中,把所有需要新增的路徑,加進去就可以了。新增庫路徑,對應的函式叫link directories,同樣,在引數中,把所有的路徑加進去就可以了。cmake中的函式呼叫,是不區分大小寫的,大小寫可以混合使用。...

gcc指定標頭檔案路徑及動態鏈結庫路徑

include 直接到系統指定的某些目錄中去找某些標頭檔案。include 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。1.會在預設情況下指定到 usr include資料夾 更深層次的是乙個相對路徑,gcc可執行程式的路徑是 usr bin gcc,那麼它在實際工作時指...