著名的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会被删除掉。