CMake使用小结

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    

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值