CMake初学笔记(一)

  • CMake是什么
  • CMake怎么实现跨平台
  • CMake具体实践过程
  • CMakeLists.txt编写快速入门
    • 常见函数
    • 例子

CMake是什么

跨平台编译工具,为了实现“write once, run everywhere”。

CMake怎么实现跨平台

  1. 开发者编写与平台无关的编译过程文件,即编写CMakeLists.txt。
  2. 最终根据目标用户的平台,根据CMakeLists.txt生成本地化的Makefile和工程文件。

CMake具体实践过程

  1. 编写CMake配置文件CMakeLists.txt
  2. 在CMakeLists.txt所在目录下创建build文件夹,mkdir build,即build和CMakeLists.txt在同一文件目录 下。
  3. 执行cmake :
    cmake PATH。其中PATH是CMakeLists.txt所在目录,例如,当前目录就是CMakeLists.txt所在目录,则可输入命令:cmake .。cmake具体用法可参照下图:
  4. make -j4,其中-j是指定CPU核心数,-j4表明分配4个CPU核心来进行编译。
  5. 生成的可执行文件在build/devel/lib/<project_name>下。

CMakeLists.txt编写快速入门

常见函数

  1. message()

例子

  1. OpenGL:Open Graphics Library的缩写,跨语言 、跨平台的图形程序接口,提供2D、3D图形渲染接口,操作在GPU之上,实现硬件加速渲染。
  2. QGLViewer:基于Qt的开源C++库,为了OpenGL的3D开发更加容易。
  3. PCL:Point Cloud Library
## Copyright (C) 2020  I. Bogoslavskyi, C. Stachniss
##
## Permission is hereby granted, free of charge, to any person obtaining a
## copy of this software and associated documentation files (the "Software"),
## to deal in the Software without restriction, including without limitation
## the rights to use, copy, modify, merge, publish, distribute, sublicense,
## and/or sell copies of the Software, and to permit persons to whom the
## Software is furnished to do so, subject to the following conditions:
##
## The above copyright notice and this permission notice shall be included in
## all copies or substantial portions of the Software.
##
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
## FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
## DEALINGS IN THE SOFTWARE.cmake_minimum_required(VERSION 3.1)  # 对cmake的最低版本要求,== CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
project(depth_clustering)  # 设置项目名称,== set(PROJECT_NAME depth_clustering)include(DistVersion.cmake)
system_info(DISTRO)
message(STATUS "DISTRO: ${DISTRO}")set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release)
endif()set(CMAKE_CXX_FLAGS "-Wall -Wextra -fPIC")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")cmake_policy(SET CMP0045 OLD)SET(CMAKE_MODULE_PATH${CMAKE_MODULE_PATH}"${PROJECT_SOURCE_DIR}/cmake_modules""/usr/share/cmake-2.8/Modules"  ## Hack for travis)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)include(CTest)
IF(IS_DIRECTORY "/usr/src/gtest/")MESSAGE(STATUS "Found google test sources in /usr/src/gtest/")ADD_SUBDIRECTORY(/usr/src/gtest/ gtest)# mimick the behaviour of find_package(GTest)SET(GTEST_FOUND TRUE)SET(GTEST_BOTH_LIBRARIES gtest gtest_main)SET(GTEST_LIBRARIES gtest)SET(GTEST_MAIN_LIBRARIES gtest_main)
ELSE()find_package(GTest)
ENDIF()set(Boost_USE_STATIC_LIBS OFF)option(BUILD_WITH_COVERAGE "Enable compilation with coverage information." OFF)
if(BUILD_WITH_COVERAGE)message(STATUS "Enabled generation of code coverage information with gcc.")set(CMAKE_CXX_FLAGS "-fprofile-arcs -ftest-coverage ${CMAKE_CXX_FLAGS}")
endif()find_package(Threads REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(OpenCV REQUIRED)
find_package(OpenGL REQUIRED)
find_package(Boost REQUIRED COMPONENTS system filesystem regex program_options)
find_package(PCL QUIET COMPONENTS common io)
find_package(QGLViewer REQUIRED)# find correct qt version
if(${DISTRO} MATCHES "14.04")find_package(Qt4 REQUIRED COMPONENTS QtCore QtXml QtOpenGL QtGui QtMultimedia)include(${QT_USE_FILE})include_directories(${QT_INCLUDES})set(MY_QT_LIBRARIESQt4::QtCoreQt4::QtXmlQt4::QtOpenGLQt4::QtGui)
elseif(${DISTRO} MATCHES "16.04" OR ${DISTRO} MATCHES "18.04")find_package(Qt5 REQUIRED COMPONENTS Core Xml OpenGL Gui Widgets)include_directories(${Qt5Core_INCLUDE_DIRS}${Qt5Xml_INCLUDE_DIRS}${Qt5Gui_INCLUDE_DIRS}${Qt5Widgets_INCLUDE_DIRS}${Qt5OpenGL_INCLUDE_DIRS})set(MY_QT_LIBRARIES${Qt5Widgets_LIBRARIES}${Qt5Core_LIBRARIES}${Qt5Gui_LIBRARIES}${Qt5Xml_LIBRARIES}${Qt5OpenGL_LIBRARIES})
endif()# some status messages
message(STATUS "Linking against Qt libs: ${MY_QT_LIBRARIES}")
message(STATUS "Linking against QGlViewer lib: ${QGLVIEWER_LIBRARY}")## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin COMPONENTSroscppsensor_msgsstd_msgsnav_msgsmessage_filterstfeigen_conversions
)# add some useful constants to configuration
configure_file(config/cmake_config.h.in${PROJECT_SOURCE_DIR}/config/cmake_config.h)
include_directories(config)if (${PCL_FOUND})message(STATUS "PCL is found. PCL-related code will be built.")if (${CMAKE_BUILD_TYPE} MATCHES "Debug" AND ${DISTRO} MATCHES "14.04")message(FATAL_ERROR"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n""You are building PCL in Debug mode with C++11 enabled.\n""This causes segmentation fault due to a bug in PCL.\n""Build in Release mode to avoid this bug.\n""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")endif()add_definitions(-DPCL_FOUND)
else()message(WARNING "PCL NOT FOUND! PCL-related code WILL NOT be built")
endif()if(${roscpp_FOUND})message(STATUS "ROS found, building ROS related parts")set(ROS_FOUND YES)
else()message(WARNING "ROS NOT FOUND. NOT building ROS related parts!")set(ROS_FOUND NO)
endif()catkin_package(INCLUDE_DIRS srcLIBRARIEScloudidentifiableground_removedifferenceimage_labelerprojectionsros_bridgevelodyne_utilsfolder_readervisualizationCATKIN_DEPENDS roscpp sensor_msgs std_msgs nav_msgs message_filters tf
)# 加载头文件
include_directories(src# for QT moc files${PROJECT_BINARY_DIR}/src# dependencies we have no control overSYSTEM ${EIGEN3_INCLUDE_DIR}SYSTEM ${Boost_INCLUDE_DIRS}SYSTEM ${PCL_INCLUDE_DIRS}SYSTEM ${OpenCV_INCLUDE_DIRS}SYSTEM ${OpenGL_INCLUDE_DIRS}SYSTEM ${QGLVIEWER_INCLUDE_DIR}SYSTEM ${catkin_INCLUDE_DIRS}
)add_subdirectory(src)
add_subdirectory(examples)message(STATUS "BUILD_TESTING: ${BUILD_TESTING}")
if (${BUILD_TESTING})add_subdirectory(test)
endif()

未完待续

CMake初学笔记(一)相关推荐

  1. cmake 学习笔记(三) (转)

    接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...

  2. python窗体设计插件_Python 界面生成器 wxFormBuilder 的入门使用(wxPython的界面设计工具的初学笔记)...

    环境,Win10,python3.7.3,wxPython 4.0.4,wxFormBuilder 3.9 1.准备一个窗体. 点击wxformbuilder上方的标签"forms" ...

  3. Lucene.Net 初学笔记 - 索引

    上次随笔写的Lucene.Net 初学笔记 - 介绍,有许多前辈让我知道了Lucene.Net已经不再更新,最后的版本写到2.9.2,不过只更新在svn上.我上次下载是官方正式发布的版本,只有2.0. ...

  4. CMake 学习笔记 02 - 更复杂的项目

    CMake 学习笔记 02 - 更复杂的项目 源代码见 https://github.com/fengyc/cmake-tutorial 源代码目录组织 一般的项目,会划分为多个子目录,每个子目录中包 ...

  5. 0起步的摄影初学笔记

    摄影初学笔记 双镜头反光相机 单镜头反光相机(单反) 光圈 类似瞳孔大小 景深  成像范围 小光圈大景深 大光圈小景深 Av模式:光圈有限模式 自己决定光圈大小 左手动镜头调光圈 右手相机调光圈 光圈 ...

  6. GAMMA初学笔记三

    GAMMA初学笔记三 简单记录下学习过程,以防后面自己忘记,如果有问题,欢迎大家交流留言. 一.语法记录 1.查看影像经纬度范围 SLC_corners 20190424.mli.par 2.拼接哨兵 ...

  7. cocoscreator初学笔记001

    cocoscrestor初学笔记 由于工作原因需要学习cocoscreator基础进行简单的游戏制作,也因为时间原因,之前自学的unity3d也放置了许久,等有空了才能填之前unity3d学习的坑了. ...

  8. Python初学笔记(第一学期学完c后和栗子一起学python)

    Python初学笔记 一.基本数据类型 1.整数 2.浮点数 3.字符串 4.布尔值(即"对"与"错"): 5.空值 二.变量的定义 1.变量名 2.变量的定义 ...

  9. ASP.NET MVC 初学笔记.3 MVC5、EF、RDLC实现报表操作

    在ASP.NET的研究学习中又要用到报表,比如在OA系统里实现凭证.文件等,报表是一个必不可少的东西,但百度了一圈,发现讲得最多的还是水晶报表等第三方报表,好像微软原装的RDLC报表随着MVC的升级渐 ...

最新文章

  1. 《Cacti实战》——第2章 环境的安装和配置
  2. mysql查看某个数据库下的所有视图
  3. ios - 使用@try、catch捕获异常:
  4. 前端一HTML:十七:背景
  5. 遮挡摄像头 判断_长治一学校门口树枝遮挡信号灯,危险!
  6. oracle 查看日志组切换状态_Oracle 逻辑结构篇 之 重做日志和归档日志管理(一)...
  7. dedecms首页怎么调用公司简介的内容
  8. 程序员编程能力和年龄的关系
  9. MapReduce 示例:减少 Hadoop MapReduce 中的侧连接
  10. 【AI面试题】AlexNet、VGGNet、GoogLeNet,ResNet等网络之间的区别是什么
  11. JAVA遍历map元素
  12. linux全局查找-find,locate,whereis,which,type区别
  13. ISO8601时间格式转换为Date
  14. 诡辩:认知与智商税!外附送签名版国庆福利
  15. ubuntu下flann库编译报错处理
  16. 企业微信自动打卡脚本
  17. 在linux系统下格式化移动硬盘的操作
  18. V4L2视频驱动框架---meida_device管理模块简述
  19. RT-Thread物联网操作系统介绍:10、计数信号量
  20. 浅谈三轮全向移动平台之——运动学逆解

热门文章

  1. 扒一扒坑人的“微信支付”SDK开发文档
  2. 【115期分享】4款小清新PPT模板免费下载
  3. 中e管家投资理财小要点
  4. 达梦数据库安装及初始化实例(命令行)
  5. Easy to understand the top ten commonly used algorithms for machine learning
  6. BMP位图基础:通过UltraEdit解析BMP文件内部结构
  7. Temporal Convolutional Network with Frequency Dimension AdaptiveAttention for Speech Enhancement
  8. DataFactory快速生成测试数据
  9. 信息化项目“监理”究竟“监理” (一)(转)
  10. 解决:ERROR: Attempting to operate on hdfs journalnode as rootERROR: but there is no HDFS_JOURNALNODE_