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++)