CMake使用小结
1.设置cmake最低版本需求
cmake_minimum_required(VERSION 3.5)
2.设置项目名称
project(XXXXX)
3.设置版本号
set(XXXXX_VERSION_MAJOR 1)
4.设置编译类型 如调试模式 DEBUG
SET(CMAKE_BUILD_TYPE DEBUG)
5.设置C++11标准
set(CMAKE_CXX_STANDARD 11)
6.查找依赖包
理想情况下,一句find_package()把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到,如下所示:
find_package (OpenCV REQUIRED NO_CMAKE_FIND_ROOT_PATH)
if(OpenCV_FOUND)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
endif()
而当find_package()无法找到依赖包时,则需要手动添加依赖包的相关路径,如下所示:
#自定义搜索规则 GLOB_RECURSE 遍历匹配目录的所有文件以及子目录下面的文件
#GLOB_RECURSE 将libcaffe.so路径添加到LIBS_CAFFE变量中
INCLUDE_DIRECTORIES(/home/he/caffe-ssd/include)
FILE(GLOB_RECURSE LIBS_CAFFE /home/he/caffe-ssd/build/lib/libcaffe.so)
7.添加工程中头文件和源文件的几种方式
1). 添加cmakelists文件所在路径下的头文件目录,${CMAKE_CURRENT_SOURCE_DIR}表示cmakelists文件所在的路径。
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}/export
${CMAKE_CURRENT_SOURCE_DIR}/libosa/inc
${CMAKE_CURRENT_SOURCE_DIR}/libalg/inc
${CMAKE_CURRENT_SOURCE_DIR}/libReg/inc
${CMAKE_CURRENT_SOURCE_DIR}/common/inc
${CMAKE_CURRENT_SOURCE_DIR}/common/log
${CMAKE_CURRENT_SOURCE_DIR}/common/imagebuf
)
2). 查找当前目录下的所有源文件,并将名称保存到 DIR_SRCS 变量
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
AUX_SOURCE_DIRECTORY(common/log DIR_SRCS)
AUX_SOURCE_DIRECTORY(common/imagebuf DIR_SRCS)
3). set environment variable,置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题
SET(PROC_ALL_FILES ${DIR_SRCS})
8.添加子模块
#如KCF_Master工程中有两个子模块,创建xml文件的XML模块和KCF单目标跟踪模块KCF。
#XML,KCF就是待添加的子模块文件夹的名称
add_subdirectory(XML)
add_subdirectory(KCF)
子模块中同样需要编写cmakelists文件,创建动态库或静态库生成.so动态链接库,若去掉SHARED则创建的是.a静态库文件;当然也可以不写cmakelists文件,此时则需要在主程序的cmakelists文件中添加子模块的头文件和源文件。
# 子目录cmakelists文件
#查找当前目录下的所有源文件,并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库 链接库名称XML需要与主程序cmakelists文件中的add_subdirectory()括号内名称保持一致
add_library (XML SHARED ${DIR_LIB_SRCS})
9.添加要编译的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${PROC_ALL_FILES}) #编译成可执行文件,需要有main函数接口
add_library(${PROJECT_NAME} SHARED ${PROC_ALL_FILES}) #编译成动态库
10.设置链接库搜索目录 该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。自写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。
#directory of opencv library
link_directories(${OpenCV_LIBS})
11.设置 target 需要链接的库
#将目标文件与库文件进行链接
target_link_libraries(
KCF_Master #工程名
XML #自己编写的依赖库
KCF #自己编写的依赖库
${OpenCV_LIBS} #第三方依赖库
${LIBS_CAFFE}
)
******** Title: cmakelists基本写法小结
******** author: He Wen
******** time: 2019-11-29 16:03
******** location: Maxvison Wuhan