著名的OpenCV采用了cmake作為工程的編譯工具,下面簡單介紹一下cmake
CMakeLists.txt
cmake
命令讀取CMakeLists.txt
文件,生成make
命令用的Makefile
文件。CMakeLists.txt
中描述了工程源碼等相關信息。
定義工程名
project(工程名)
通過這句話,我們定義了我們的工程名,這里會自動定義2個變量工程名_BINARY_DIR
和工程名_SOURCE_DIR
。這兩個變量分別保存了生成目標所在路徑和源代碼所在路徑。
定義目標類型
#編譯出可執行程序
add_executable(程序名 源文件列表)
#編譯出動態庫,生成的文件為`lib庫名.so`
add_library(庫名 SHARED 源文件列表)
#編譯出靜態庫
add_library(庫名 STATIC 源文件列表)
獲取源文件列表
最簡單的方式是一個一個文件一個文件添加,再就是使用file
指令遍歷目錄下的文件
#遞歸遍歷
file(GLOB_RECURSE SRC_LIST [目錄/]*.cpp)
#或只看當前目錄下文件
file(GLOB SRC_LIST [目錄/]*.cpp)
add_executable(程序名 ${SRC_LIST})
添加頭文件查找路徑
假設我的頭文件搜索路徑為工程根目錄下的src
和include
兩個目錄。
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/src)
PROJECT_SOURCE_DIR
和工程名_SOURCE_DIR
內容相同,都是源碼根目錄。
使用外部庫
以使用OpenCV為例[3]
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries( ${EXEC_NAME} ${OpenCV_LIBS} )
find_package
find_package(<NAME>)
指令會設置如下變量:
<NAME>_FOUND
-
<NAME>_INCLUDE_DIRS
or<NAME>_INCLUDES
-
<NAME>_LIBRARIES
or<NAME>_LIBS
<NAME>_DEFINITIONS
find_package
工作原理請參考[1]
target_link_libraries
指定目標依賴的庫信息
Debug/Release
默認cmake生成的makefile為Release版本,如果我們要編譯Debug版,可以在cmake執行時,指定參數-DCMAKE_BUILD_TYPE=Debug
[4]
安裝
使用install
指令,指定安裝的目標位置
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)
install (DIRECTORY include/ DESTINATION include)
默認安裝在/usr/local
,可以通過指定CMAKE_INSTALL_PREFIX的值來變更安裝目錄。
生成安裝包
# 構建一個 CPack 安裝包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)
在make完成后,執行命令
cpack -C CPackConfig.cmake
其他
自動添加子目錄
file(GLOB SUBDIRS *)
foreach(DIR ${SUBDIRS})
if(IS_DIRECTORY ${DIR})
add_subdirectory(${DIR})
endif()
endforeach()
取得當前目錄名
[2]
get_filename_component(EXEC_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" EXEC_NAME ${EXEC_NAME})
設置目標版本
set_target_properties(目標名稱 PROPERTIES VERSION 0.1.1 SOVERSION 0.1)
指定rpath
參考連接,沒能試驗成功啊。在安裝后rpath會被刪除掉。