CMake基本使用

2021-09-26 10:06:57 字數 3589 閱讀 7095

0、

指令是大小寫無關的,引數和變數是大小寫相關的。

1、set()指令

set(var ),用來顯式的定義變數

2、add_subdirectory()

add_subdirectory(source_dir [binary_dir]),用於向當前工程新增存放原始檔的子目錄,即當前目錄下還有乙個資料夾裡有需要編譯的原始碼,並可以指定中間二進位制和目標二進位制存放的位置。

3. 鏈結共享庫

target_link_libraries(target library1 library2 ...),為 target(可執行程式) 新增需要鏈結的共享庫

4、特殊的環境變數

cmake_include_path()

cmake_library_path()

如果標頭檔案沒有存放在常規路徑(/usr/include, /usr/local/include 等),則可以通過這些變數就行彌補。

5、標頭檔案搜尋路徑

include_directories(directory1 directory2 ...),尋找包的標頭檔案。

如:

include_directories(

$$/include

$)

6、常用指令

1、find_path(name1 path1 path2 ...),用來在指定路徑中搜尋檔名,var 變數代表包含這個檔案的路徑。

2、find_file(name1 path1 path2 ...),var 變數代表找到的檔案全路徑,包含檔名

3、find_package

// 引數quiet表示緊掉包沒有被發現時的警告資訊, 

// required表示若包沒有找到則cmake過程停止

find_package(第三方包名 需要的最低版本號 required/quiet)

如:

find_package(eigen3 3.1.0 required)

find_package(pangolin required)

find_package(opencv 3.0 quiet)

4、add_dependencies(target-name depend-target1 depend-target2 ...),定義 target 依賴的其他 target,確保在編譯本 target 之前,其他的 target 已經被構建。

5、aux_source_directory(),發現乙個目錄下所有的源**檔案並將列表儲存在乙個變數中,這個指令臨時被用來自動構建原始檔列表。比如在add_executable中原始檔很多,把所有原始檔的名字都加進去將是一件煩人的工作。這時可以這麼寫

# 查詢當前目錄下的所有原始檔,並將名稱儲存到 dir_srcs 變數

aux_source_directory(. dir_srcs)

# 指定生成目標

add_executable(demo $)

6、project(),會隱式的定義_binary_dir_source_dir兩個變數,即生成工作檔案目錄路徑。

7、file(glob variable [relative path] [globbing expressions]...)

glob 用於產生乙個檔案(目錄)路徑列表並儲存在variable 中,檔案路徑列表中的每個檔案的檔名都能匹配globbing expressions(非正規表示式,但是類似)。如果指定了 relative 路徑,那麼返回的檔案路徑列表中的路徑為相對於 relative 的路徑。

7、常用變數

1、cmake_current_source_dir,指的是當前處理的 cmakelists.txt 所在的路徑

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

置一下。比如

set(cmake_module_path $/cmake)

這時候你就可以通過 include 指令來呼叫自己的模組了。

1、動態鏈結庫

使用link_directories()命令來指定第三方庫所在路徑;

target_link_libraries(target library ),為 target(可執行程式) 新增需要鏈結的共享庫

如:

link_directories

($/lib) #新增動態連線庫的路徑

target_link_libraries

(-lmylib ) #新增libmylib.so

2、靜態鏈結庫

靜態庫的新增:

add_library(mxnet static imported)

set_property(target mxnet property imported_location /path/to/libmxnet.a)

target_link_libraries(project_name mxnet ) #新增libmxnet.a

3、高階

如果電腦中安裝了兩個版本的opencv,需要選擇乙個。首先確定opencv不同版本在電腦中的安裝位置,如果是在/usr/local下以不同版本號命名:

// 明確find_package的尋找路徑

set(opencv_dir /usr/local/opencv2.4.13/share/opencv)

find_package(opencv 2.4 required)

// 告訴系統標頭檔案在**

include_directories(system $ /usr/local/opencv2.4.13/include)

// 告訴第三方庫檔案在**

link_directories($ /usr/local/opencv2.4.13/lib)

// 將庫檔案與專案鏈結上

target_link_libraries($ $)

參考文章

【技巧一分鐘】cmakelists.

參考

Cmake的基本使用

這幾天專案中接觸到了ndk相關的東西,順便把cmake相關的東西補了一下。搞明白了之後,使用clion都得心應手了!這篇部落格記錄一些自己使用到了的並且理解了用法。cmake最終生成的是相應的所需要的makefile,但是makefile有很多種,因此它可以起到乙個跨平台的作用。命令解釋 示例add...

cmake取消巨集定義 CMake基本使用

cmake是個很方便的構建系統。官方的文件寫的很明白,就是有點長。於是,根據自己的使用情況,挑選其中最重要的,簡要說明於下 cmakelists.txt的編寫 cmakelists.txt的命令不區分大小寫。基本結構 最低版本宣告,如果本機的cmake版本小於這個,會告警 cmake minimum...

CMake基本使用 常更

將乙個檔案下所有原始檔 新增到檔案target 使用正規表示式匹配 file globlocation src location h location cpp 新增檔案到target add executable target 設定c 語法 c 11 set cmake cxx standard 1...