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...