基本語句
外部編譯源碼
- 文檔結構
--projecct --main.cpp --class1.cpp --class1.h --Cmakelist.txt --build
- 項目名
PROJECCT(hello)
- 版本說明
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
- 編譯可執行檔案
ADD_EXECUTABLE(hello main.cpp class1.cpp)
- 或者用變量指定源檔案
SET(SRC_LIST main.cpp class1.h class1.cpp)
或者ADD_EXECUTABLE(hello SRC_LIST)
SET(SOURCE_FILES main.cpp class1.h class1.cpp)
ADD_EXECUTABLE(hello SOURCE_FILES)
- 消息提示添加
MESSAGE(STATUS “this is BINARY dir ” ${PROJECT_BINARY_DIR})
其中MESSAGE(STATUS “this is SOURCE dir ” ${PROJECT_SOURCE_DIR})
也可以寫作PROJECT_BINARTY_DIR
HELLO_BINARY_DIR
,是build後存放二進制可執行檔案的路徑。
其中
也可以寫作PROJECT_SOURCE_DIR
,是項目路徑。HELLO_SOURCE_DIR
- 編譯過程
cd ~/project mkdir build cd build cmake .. make
是父級目錄;..
.
是目前目錄
cmake後build裡會生成 makefile 檔案
make 後生成 hello.bin
./hello 運作程式
清理工作:make clean
編譯靜/動态庫
簡單靜态庫
假設想要生成一個靜态庫libclass.a
- 文檔結構
--project --main.cpp --class.cpp --class.h --Cmakelist.txt --build
- CmakeList.txt如下
PROJECT(HELLO) CMAKE_MINIMUM_REQUIRED(VERSION ) ADD_EXECUTABLE(hello hello.cpp) ADD_LIBRARY(class class.cpp)
其中
可以用下面等代碼替換ADD_LIBRARY(class class.cpp)
SET(LIBCLASS_SRC hello.cpp)
ADD_LIBRARY(class ${LIBCLASS_SRC})
生成動态庫
- 文檔結構
--projecct
--lib
--hello.cpp
--hello.h
--CmakeList.txt
--CmakeList.txt
--build
- project檔案夾下的CmakeList如下
PROJECT(hellolib) ADD_SUBDIRECTORY(lib)
- lib檔案夾下的CmakeList如下
SET(LIBHELLO_SRC class.cpp) ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})添加
編譯後會在build/lib/下生成 libhello.so
- 語句
ADD_LIBRARY(libname[SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL]source1 source2 ...)
SHARED –動态庫
STATIC –靜态庫
-
指定動态庫生成的位置
可以在主工程的CmakeList.txt中添加一行
SET(LIBRARY_OUTPUT_PATH <path_to_lib>)
同時生成同名的靜态庫與動态庫
- 在上面的動态庫工程中,如果在
後添加ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
發現build/lib/下隻有靜态庫 libhello.aADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
這是因為hello作為一個target是不能重命名的
- 把
改成ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
重新編譯。可以得到ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
和libhello.so
libhello_static.a
- 為了得到同名的靜态庫和動态庫,用指令:
在lib/CmakeList.txt中這麼寫:SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)
重新編譯就可以得到 libhello.so 和 libhello.a 兩個庫。SET(LIB_SRC hello.cpp hello.h) ADD_LIBRARY(hello SHARED ${LIB_SRC}) ADD_LIBRARY(hello_static STATIC ${LIB_SRC}) SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
-
cmake 在建構一個新的 target 時,會嘗試清理掉其他使用這個名字的庫,因為,在建構 libhello.a 時,
就會清理編譯前已經存在的 libhello.so。如果分批編譯,又要防止同名庫被清理,可以在lib/CmakeList.txt中添加:
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT ) SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT )
使用外部庫和頭檔案
以手動添加OPENCV為例子:
頭檔案路徑
/usr/local/include
也可以通過 ~/.bashrc 添加
opencv常用的庫 libopencv_core.so libopencv_highgui.so libopencv_imgproc.so
- 檔案結構
--project --src --main.cpp --CmakeList.txt --CmakeList.txt --build
- project/CmakeList.txt:
PROJECT(main) ADD_SUBDIRECTORY(src)
- src/CmakeList.txt:
ADD_EXECUTABLE(main main.cpp) INCLUDE_DIRECTORIES(/usr/local/include/) TARGET_LINK_LIBRARIES(main /usr/local/lib/libopencv_core.so)
添加頭檔案搜尋目錄
INCLUDE_DIRECTORIES(/usr/local/include)
添加庫搜尋目錄
LINK_DIRECTORIES(/usr/local/opencv/lib)
添加外部庫連結
target_link_libraries(main /usr/local/lib/libopencv_core.so usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so)
也可以寫成
TARGET_LINK_LIBRARIES(main hello)
TARGET_LINK_LIBRARIES(main libhello.so)
使用FIND_PACKAGES 添加 OPENCV
cmake_minimum_required(VERSION .)
project(heatmap)
set(CMAKE_CXX_STANDARD )
set(SOURCE_FILES main.cpp heat.cpp heat.h)
find_package(OpenCV REQUIRED)
set(OpenCV_FOUND TRUE CACHE BOOL "" FORCE)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(heatmap ${OpenCV_LIBS})
add_executable(heatmap ${SOURCE_FILES})