本文首发于微信公众号「3D视觉工坊」——CMakeLists.txt文件如何写?

本文以linux平台下CMakeLists.txt文件书写方法总结。

一 开头通用模块

1.1 cmake版本要求

cmake_minimum_required( VERSION 2.8 )

#工程文件名loop_closure,可任取

project( loop_closure )

#工程文件名loop_closure,可任取

project( loop_closure )

1.2 编译模式

IF(NOT CMAKE_BUILD_TYPE)SET(CMAKE_BUILD_TYPE Release)
ENDIF()
MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})

当然如果此处在前面加上语句:

set(**CMAKE_BUILD_TYPE**** debug**)

即表示设置为debug模式编译。

1.3 检查C++版本

检查C++的版本

    # Check C++11 or C++0x supportinclude(CheckCXXCompilerFlag)CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)if(COMPILER_SUPPORTS_CXX11)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")add_definitions(-DCOMPILEDWITHC11)message(STATUS "Using flag -std=c++11.")elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")add_definitions(-DCOMPILEDWITHC0X)message(STATUS "Using flag -std=c++0x.")else()message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")endif()

二 项目文件配置模块

接下来,便开始配置各个库模块。

2.1 如果仅包含OpenCV库时

set(OpenCV_DIR "/usr/local/include/opencv3.2.0/share/OpenCV")
find_package(OpenCV REQUIRED)include_directories( ${OpenCV_INCLUDE_DIRS} )#生成可执行文件add_executable(${PROJECT_NAME} src/loop_closure.cpp )target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

备注:这里的OpenCV包含目录为含有OpenCVConfig.cmake的路径。

如下图:

2.2 如果包含第三方库,该库为源码形式(.h和.cpp),非动态链接库

此处以在工程中添加词袋库DBoW2为例,这里的DBoW2是以源码形式包含,也即未编译成.so文件。

2.2.1 包含第三库的头文件

#设置.h文件对应的路径

set( DBoW2_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/ThirdParty/DBow-master/include/)

#包含.h文件路径

 include_directories( ${OpenCV_INCLUDE_DIRS}${DBoW2_INCLUDE_DIRS} ${DBoW2_INCLUDE_DIRS}/DBoW2/)
注:上述为啥要用两条路径${ DBoW2_INCLUDE_DIRS}和${DBoW2_INCLUDE_DIRS}/DBoW2/?

为了防止在include层找不到,继续往下一层路径include/DBoW2/路径下查找,这是为了防止某些文件的包含路径不一致导致头文件查找错误。

2.2.2 包含第三方库的cpp文件

set(DBoW2_SRCS "${PROJECT_SOURCE_DIR}/ThirdParty/DBow-master/src")
#生成可执行文件
add_executable(${PROJECT_NAME} src/loop_closure.cpp  src/run_main.cpp${DBoW2_SRCS}/BowVector.cpp ${DBoW2_SRCS}/FBrief.cpp ${DBoW2_SRCS}/FeatureVector.cpp${DBoW2_SRCS}/FORB.cpp ${DBoW2_SRCS}/FSurf64.cpp ${DBoW2_SRCS}/QueryResults.cpp ${DBoW2_SRCS}/ScoringObject.cpp)

其中,src/loop_closure.cpp src/run_main.cpp 为本工程中我自己实现的,而对于其他的cpp文件,则直接添加路径即可。

另一种方式,添加cpp文件路径更为简洁方便。

file(GLOB DBoW2_SRCS ${PROJECT_SOURCE_DIR}/ThirdParty/DBow-master/src/*.cpp)
add_executable(${PROJECT_NAME} src/loop_closure.cpp  src/run_main.cpp ${DBoW2_SRCS})

2.3 如果包含第三方库,为库形式(此处以静态库为例(.a后缀))

在上述工程下,同时还包含有DBoW3库,此库已经按默认路径编译安装到计算机内存中。我们可以按如下方式添加DBoW3库。

1)包含头文件

set( DBoW3_INCLUDE_DIRS "/usr/local/include")

2)添加库

set( DBoW3_LIBS "/usr/local/lib/libDBoW3.a")
target_link_libraries(${PROJECT_NAME }
${OpenCV_LIBS}
${DBoW3_LIBS}
)

通过上述方式,即可调用。

三 一个简单的CMakeLists.txt文件demo

该demo中相较于上述总结添加的库,还额外包含了DLib库。

cmake_minimum_required( VERSION 2.8 )
project( loop_closure )#set(CMAKE_BUILD_TYPE  Debug)
IF(NOT CMAKE_BUILD_TYPE)SET(CMAKE_BUILD_TYPE Release)
ENDIF()MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})# Check C++11 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")add_definitions(-DCOMPILEDWITHC11)message(STATUS "Using flag -std=c++11.")
elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")add_definitions(-DCOMPILEDWITHC0X)message(STATUS "Using flag -std=c++0x.")
else()message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()#opencv
#set(OpenCV_DIR "/usr/local/include/opencv3.2.0/share/OpenCV")
set(OpenCV_DIR "/opt/ros/kinetic/share/OpenCV-3.3.1-dev")find_package(OpenCV REQUIRED)set( DBoW3_INCLUDE_DIRS "/usr/local/include")set( DBoW2_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/ThirdParty/DBow-master/include/)
message(${DBoW2_INCLUDE_DIRS})#important
#file(GLOB DBoW2_SRCS ${PROJECT_SOURCE_DIR}/ThirdParty/DBow-master/src/*.cpp)
#message(${DBoW2_SRCS})set(DBoW2_SRCS "${PROJECT_SOURCE_DIR}/ThirdParty/DBow-master/src")
message(${DBoW2_SRCS})find_package(DLib QUIETPATHS ${DEPENDENCY_INSTALL_DIR})
if(${DLib_FOUND})message("DLib library found, using it from the system")include_directories(${DLib_INCLUDE_DIRS})add_custom_target(Dependencies)
else(${DLib_FOUND})message("DLib library not found in the system, it will be downloaded on build")option(DOWNLOAD_DLib_dependency "Download DLib dependency" ON)if(${DOWNLOAD_DLib_dependency})ExternalProject_Add(DLibPREFIX ${DEPENDENCY_DIR}GIT_REPOSITORY http://github.com/dorian3d/DLibGIT_TAG masterINSTALL_DIR ${DEPENDENCY_INSTALL_DIR}CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>)add_custom_target(Dependencies ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR} DEPENDS DLib)else()message(SEND_ERROR "Please, activate DOWNLOAD_DLib_dependency option or download manually")endif(${DOWNLOAD_DLib_dependency})
endif(${DLib_FOUND})include_directories( ${OpenCV_INCLUDE_DIRS}${DBoW3_INCLUDE_DIRS} ${DBoW2_INCLUDE_DIRS} ${DBoW2_INCLUDE_DIRS}/DBoW2/)message("DBoW3_INCLUDE_DIRS ${DBoW3_INCLUDE_DIRS}")
message("DBoW2_INCLUDE_DIRS ${DBoW2_INCLUDE_DIRS}")message("opencv ${OpenCV_VERSION}")# dbow3
# dbow3 is a simple lib so I assume you installed it in default directory
set( DBoW3_LIBS "/usr/local/lib/libDBoW3.a")add_executable(${PROJECT_NAME} src/loop_closure.cpp  src/run_main.cpp${DBoW2_SRCS}/BowVector.cpp ${DBoW2_SRCS}/FBrief.cpp ${DBoW2_SRCS}/FeatureVector.cpp${DBoW2_SRCS}/FORB.cpp ${DBoW2_SRCS}/FSurf64.cpp ${DBoW2_SRCS}/QueryResults.cpp ${DBoW2_SRCS}/ScoringObject.cpp)
message(${DBoW2_SRCS}/BowVector.cpp)target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}${DLib_LIBS}
${DBoW3_LIBS}
)

四 跋

以上仅仅为CMakeLists.txt的一个简单用法梳理,如有不到之处,还请批评指正。对于大型工程的管理,还有很多学问可以挖掘,此处限于篇幅便不再展示,欢迎加入我们的学习圈「3D视觉技术」进一步探讨、交流、学习。

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

CMakeLists.txt文件如何编写?(一 基础篇)相关推荐

  1. 熟悉 CMake(二)—— 以一个实例说明 CMakeLists.txt 文件的编写

    原文请见 cmake使用总结(转)-工程主目录CMakeList文件编写 在 Linux 下进行开发很多人选择编写 makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量 ...

  2. cmakelist官方教程_CMakeLists.txt文件如何编写?(一 基础篇)

    本文以linux平台下CMakeLists.txt文件书写方法总结. 一 开头通用模块 1.1 cmake版本要求 cmake_minimum_required( VERSION 2.8 ) #工程文 ...

  3. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  4. 从零开始编写网络游戏--基础篇(1)

    最近2周比较忙,没有抽出时间来写Blog,不过在这段时间里面把整个思路理了一遍,梳理了一下大纲,以后会多抽时间来写Blog. 好了,言归正传,做任何事情都需要一定的基础,没有坚实的地基,是不可能建立雄 ...

  5. ROS学习(六):CMakeLists.txt 文件

    CMakeLists.txt 文件 为 CMake build 文件.是 CMake 编译系统中软件包的输入.描述如何编译代码.安装到哪里. http://wiki.ros.org/catkin/CM ...

  6. PX4 CMakeLists.txt 文件剖析

    PX4 CMakeLists.txt 文件剖析 前面对于 PX4 的 Makefile 已经做了比较详细的分析, 见这里, 这里进一步对 PX4 的 CMakeLists.txt 文件结构进行进一步的 ...

  7. 在CMakeLists.txt文件中包含Eigen

    挺简单的一个问题,弄了好半天,主要是关于CMAKELISTS的一些语法和Eigen的库记不清楚了:这里整理一下做一个记录: 首先说Eigen只有头文件(headers only),只需要设定一个包含路 ...

  8. pyqt5从子目录加载qrc文件_PyQt5快速上手基础篇10-QSettings用法

    前言 本节我们学习使用PyQt5的QSettings的用法,使用QSettings可以记住用户操作UI界面设置的参数,下次打开软件的时候,会直接加载用户上一次设置的参数. 一.基础知识 1.QSett ...

  9. CMakeLists.txt文件常见编译错误

    错误一:目标文件未成功链接到该函数HelloFunc所在的库文件或者未安装该库文件 CMakeFiles/hello.dir/main.c.o:在函数'main'中: main.c:(.text+0x ...

最新文章

  1. 数据中台应用实战50篇(二)-中台解决方案本质在解决什么问题?
  2. POJ1703 Find them, Catch them 并查集
  3. [luoguP4142]洞穴遇险
  4. 快手 算法工程师 0825 笔试题
  5. js中的if与Java中的if_JS直接if参数的用法JS中!和!!区别
  6. 用 pre-commit hook 解决 Python 项目编码规范
  7. OpenCart 2.x 系统商品数量库存减少逻辑
  8. 前端性能监控你会监控哪些数据? 如何做?
  9. python数据分析推荐课程_coursera上有哪些值得学习的Python,数据分析的课程
  10. css中背景颜色的代码,css背景代码是什么,css怎么控制背景颜色
  11. win10下装黑苹果双系统
  12. 2018美日科学家因免疫治疗得诺贝尔生理医学奖|动图展示历年生理学奖
  13. lombok报错Ambiguous method call. Both
  14. 快讯分类_如何掌握Google快讯
  15. 视频教程-HoloLens与ARcore第三视角开发-其他
  16. python自然语言处理入门-新手上路
  17. 我奋斗了18年不是为了和你壹起喝咖啡
  18. notify验签失败及其原因
  19. 自考计算机原理,自考计算机原理考点.doc
  20. java反射机制详解篇一(基础)

热门文章

  1. 设计模式模式游客(Visitor)摘录
  2. [memcached] 2. 高级应用
  3. 败了一块7600GS AGP显卡
  4. 百度短视频推荐系统的目标设计
  5. 深度排序模型在淘宝直播的演进与应用
  6. 对比 5 种分布式事务方案,还是宠幸了阿里的 Seata(原理 + 实战)
  7. 一口气说出 OAuth2.0 的四种授权方式
  8. 震惊!线上四台机器同一时间全部 OOM,到底发生了什么?
  9. 拜托别在问我 MySQL 性能优化了!
  10. 如何解决组织协同?用智办事更简单!