1. 程式人生 > >CmakeList: 基本用法和例項

CmakeList: 基本用法和例項

最近需要自己寫CMakaList,所以簡要寫一下一些基本的操作。為圖實用,只寫了常用的簡單操作。

1.確定cmake最低版本需求

cmake_minimum_required(VERSION 3.0.0)

2.確定工程名

project(Deepsort)

這個不是必須,但是最好寫一下,這一行會引入兩個變數XXX_BINARY_DIR (二進位制檔案儲存路徑)和 XXX_SOURCE_DIR(原始碼儲存路徑)

3.新增需要的庫

set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/share/OpenCV")
find_package(OpenCV 3.2.0 REQUIRED)

find_package令CMake搜尋所有名為Find.cmake的檔案,3.2.0 REQUIRED給出需要的具體版本,以避免一臺電腦安裝了多個版本opencv而造成不必要的錯誤。通常情況下,通過設定CMAKE_PREFIX_PATH來設定CMake搜尋路徑,通常情況下不加也可以,但考慮到程式碼的可移植性,最好還是對搜尋路徑進行對應設定

4.新增需要的標頭檔案

include_directories(include)
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(/usr/local/cuda-8.0/include/)

如上,將標頭檔案所在路徑寫在括號內即可(上例中將標頭檔案放在了include資料夾中),而需要的一些庫的標頭檔案可以如2行變數的形式,也可以如3行直接給出庫標頭檔案所在的位置

5.確定編譯語言

以使用c++為例,可以用set來設定

set(CMAKE_CXX_STANDARD 11)

也可以通過add_definitions來設定

add_definitions(-std=c++11)

6.設定變數

ADD_DEFINITIONS( -DGPU -DCUDNN )

如darknet中程式碼編譯需要define變數GPU,CUDNN,OPENCV等,則用該語句進行定義

7.新增原始碼

set(SRC  ${PROJECT_SOURCE_DIR}/test.cpp
          ./testA.cpp)

通過設定SRC變數,將原始碼路徑都給SRC,如果有多個,可以直接在後面繼續新增

set(SRC 
    ${PROJECT_SOURCE_DIR}/src/detector.cpp
    ${PROJECT_SOURCE_DIR}/src/demo.cpp
    ${PROJECT_SOURCE_DIR}/test.cpp
)

8.編譯動態庫並連結庫檔案

link_directories(${PROJECT_SOURCE_DIR})
add_library(plate_recognition SHARED ${SRC})
target_link_libraries(plate_recognition ${OpenCV_LIBS})
target_link_libraries(plate_recognition -llianghao  -lpthread -lm -lstdc++)

add_library為生成庫檔案,SHARED為生成動態庫,STATIC為生成靜態庫,前面的plate_recognition為生成的檔名,如上生成的動態庫為libplate_recognition.so,最後${SRC}為原始檔路徑。 
target_link_libraries為連結需要的庫,plate_recognition為需要進行連結的檔名,後面接需要連結的庫,如第三行連結了opencv。如果需要連結其他的動態庫,-l後接去除lib字首和.so字尾的名稱,以連結liblianghao.so為例,-llianghao。

9.生成可執行檔案

link_directories(${PROJECT_SOURCE_DIR})
add_executable(Test ${SRC})
target_link_libraries(Test ${OpenCV_LIBS})
target_link_libraries(Test -llianghao  -lpthread -lm -lstdc++)

和8中只有第二行的區別,add_executable表示生成可執行檔案,Test為生成的可執行檔名,後接原始檔路徑。

10.整體例項

cmake_minimum_required(VERSION 3.2.0)
add_definitions(-std=c++11)
add_definitions(-g -o2)
#define cuda,opencv,cudnn
ADD_DEFINITIONS( -DGPU -DCUDNN ) 
# use opencv
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/share/OpenCV")
find_package(OpenCV 3.2.0 REQUIRED)
if(NOT OpenCV_FOUND)
  message(WARNING "OpenCV not found!")
else()
  include_directories(${OpenCV_INCLUDE_DIRS})
endif()
# CUDA path
include_directories(/usr/local/cuda-8.0/include/
                    /usr/include)
# headers
include_directories(${PROJECT_SOURCE_DIR}/include)
#sources
set(SRC  ${PROJECT_SOURCE_DIR}/test.cpp)
#lib link
link_directories(${PROJECT_SOURCE_DIR})
link_directories(${OpenCV_LIBRARY_DIRS})
#build so
add_library(plate_recognition SHARED ${SRC})
target_link_libraries(plate_recognition ${OpenCV_LIBS})
target_link_libraries(plate_recognition -lxxx -lxxx  -lpthread -lm -lstdc++)