CMake基本使用

一、 基礎指令

0、

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

1、set()指令

set(var <value>),用來顯式的定義變量

2、add_subdirectory()

add_subdirectory(source_dir [binary_dir]),用於向當前工程添加存放源文件的子目錄,即當前目錄下還有一個文件夾裏有需要編譯的源碼,並可以指定中間二進制和目標二進制存放的位置。

3、添加共享庫

link_directories(directory1 directory2 ...),尋找包的頭文件。
如:

include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${EIGEN3_INCLUDE_DIR}
)

target_link_libraries(target library1 library2 ...),爲 target(可執行程序) 添加需要鏈接的共享庫

4、特殊的環境變量

cmake_include_path()
cmake_library_path()
如果頭文件沒有存放在常規路徑(/usr/include, /usr/local/include 等),則可以通過這些變量就行彌補。

5、引入頭文件搜索路徑

include_directories()

6、常用指令

1、find_path(<VAR> name1 path1 path2 ...),用來在指定路徑中搜索文件名,VAR 變量代表包含這個文件的路徑。
2、find_file(<VAR> 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(<dir> <VARIABLE>),發現一個目錄下所有的源代碼文件並將列表存儲在一個變量中,這個指令臨時被用來自動構建源文件列表。比如在 add_executable 中源文件很多,把所有源文件的名字都加進去將是一件煩人的工作。這時可以這麼寫

# 查找當前目錄下的所有源文件,並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)

# 指定生成目標
add_executable(Demo ${DIR_SRCS})

6、project() ,會隱式的定義<projectname>_BINARY_DIR<projectname>_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 ${PROJECT_SOURCE_DIR}/cmake)
這時候你就可以通過 INCLUDE 指令來調用自己的模塊了。

二、添加鏈接庫

1、動態鏈接庫

使用LINK_DIRECTORIES() 命令來指定第三方庫所在路徑;
target_link_libraries(target library ),爲 target(可執行程序) 添加需要鏈接的共享庫。
如:

link_directories(${PROJECT_SOURCE_DIR}/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下以不同版本號命名:
在這裏插入圖片描述這裏可以看到/usr/local下有兩個不同版本opencv,opencv2.4.13和opencv3.4.8,下面來看看我們的CMakeLists如何改:

// 明確find_package的尋找路徑
set(OpenCV_DIR /usr/local/opencv2.4.13/share/OpenCV)
find_package(OpenCV 2.4 REQUIRED)

// 告訴系統頭文件在哪裏
 include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS} /usr/local/opencv2.4.13/include)

// 告訴第三方庫文件在哪裏
link_directories(${OpenCV_LIBRARY_DIRS} /usr/local/opencv2.4.13/lib)

// 將庫文件與項目鏈接上
target_link_libraries(${項目名} ${OpenCV_LIBRARY_DIRS})
參考文章

【技巧一分鐘】CMakeLists.
參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章