CMake初学笔记(一)

news2025/1/20 19:22:13

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_LIBRARIES
      Qt4::QtCore
      Qt4::QtXml
      Qt4::QtOpenGL
      Qt4::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 COMPONENTS
  roscpp
  sensor_msgs
  std_msgs
  nav_msgs
  message_filters
  tf
  eigen_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 src
 LIBRARIES
      cloud
      identifiable
      ground_remove
      difference
      image_labeler
      projections
      ros_bridge
      velodyne_utils
      folder_reader
      visualization
 CATKIN_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 over
  SYSTEM ${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()

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv_c++学习(十八)

一、连通域分析 连通域分割原理&#xff1a; 邻域分为4邻域和8邻域。如上图所示。当使用连通域分割方法时&#xff0c;需要首先将图像进行二值化处理&#xff0c;在进行连通域的处理。右图为连通域分割两遍法的一个示意图&#xff0c;具体原理可以自行查询&#xff0c;这里只…

零基础学网络安全/web安全,一般人还真学不会

零基础学网络安全能不能学的会&#xff1f; 首先&#xff0c;肯定是可以学会的。 &#xff1f; 是不是和标题不一样&#xff1f;听我继续说 不过&#xff0c;难度会比有一些编程或者网络基础的人大一些。 网络安全需要天分努力才能成就大佬。而且&#xff0c;天分占比远比…

基于springboot+mybatis+mysql+vue学生选课管理系统

基于springbootmybatismysqlvue学生选课管理系统 一、系统介绍二、功能展示1.用户登陆2.课程列表(学生)3.选课(学生)4.查询成绩(学生)5.我的课程&#xff08;老师&#xff09;6.主页&#xff08;老师&#xff09;7.开设课程&#xff08;老师&#xff09;8.成绩管理&#xff08;…

七、jdbcTemplate

一、JdbcTemplate(概念和准备) 1.什么是JdbcTemplate Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便对数据库操作 2.准备工作 引入相关的jar包 在spring配置文件配置数据库连接池 <!--数据库连接池--> <bean id"dataSource" class"c…

图像处理:灰度图片线性截断拉伸

1. 为什么要拉伸 很多时候&#xff0c;灰度图片的灰度级较大&#xff0c;而像素值的分布比较集中&#xff0c;这就导致灰度级的利用率过低&#xff0c;从而导致图片的对比度很小&#xff0c;人眼的感官体验很不好&#xff0c;因此我们通常需要对原始的图像数据进行拉伸调整&…

​数据库原理及应用上机(实验六 视图的定义和维护)

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验 ​ 目录 ✨一、实验目的和要求 ✨二、实验内容 ✨三、实验结果 ✨四&#xff0e;实验总结 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理后期还会不断…

小白漂流记(如何自学网络安全?)

一、前言&#xff08;关于我&#xff09; 我算是“入行”不久的一个新人安全工作者&#xff0c;为什么是引号呢&#xff0c;因为我是个“半个野路子”出身。早在13年的时候&#xff0c;我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力&#xf…

【Python入门篇】——Python中循环语句(for循环的嵌套应用)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

普洱突围“春茶江湖”,抖音电商「春茶普洱季」解锁好茶生意新增量

“越沉越香”&#xff0c;是普洱茶鲜明的味道符号。国内普洱茶市场热自2000年左右兴起&#xff0c;并逐渐在春茶市场上占据重要的一席之地。为顺应春茶季节打造“普洱爆品”&#xff0c;实现生意的应季增长&#xff0c;抖音电商也为品牌商家提供了更为完善的营销与经营解法。 …

极米科技发布新一代光源技术,投影行业要变天?

作者&#xff1a;坚白 2018年以来&#xff0c;在年轻人群的追捧下&#xff0c;此前主要应用于商用场景的投影仪&#xff0c;逐渐切换到家用场景&#xff0c;而且随着投影技术的持续改进&#xff0c;投影效果也不断提升&#xff0c;家用投影市场进入高速发展期。 但进入2022年…

微信小程序组件设计规范分享

WeUI是一套与微信原生视觉体验一致的基本样式库。微信官方设计团队为微信网页和微信小程序量身定制设计&#xff0c;使用户感知更加统一&#xff0c;包括button、cell、dialog、progress、toast、article、actionsheet、微信weui开发团队可以直接使用icon等各种元素。下面资源社…

基于postman测试接口(整套接口测试)(附视频教程加源码)

目录 可以解决的问题 开启控制台 单个测试尝试 使用请求结果当参数 打印结果(JSON) 自定义可视化结果 随机参数 测试用例连接 一键测试接口集合 从swagger导入接口 自定义全局变量 可以解决的问题 几百个接口人工测试接口过于繁杂大多测试无法使用请求结果当参数可以…

(转载)从0开始学matlab(第12天)—选择语句(if、switch、try/catch)

选择结构可以使 MATLAB 选择性执行指定区域内的代码 ( 称之为语句块 blocks)&#xff0c;而跳过其他区域的代码。选择结构在 MATLAB 中有三种具体的形式 :if 结构&#xff0c; switch 结构和try/catch 结构。 1 if 结构 1.1if语句的基本形式 if 结构的基本形式如下: 其…

菜鸡shader:L3三色环境光材质、阴影及光衰

三色环境光材质 先放上最终效果这里将环境光分为上中下三层&#xff0c;顶层是红色的&#xff0c;中间那层是绿色的&#xff0c;下层则是蓝色的。环境光遮蔽效果则是直接采样事先准备好的AO贴图。 首先是上层环境光&#xff1a; 这里我们只需要法线向量的第二个分量&#xf…

casbin基于RBAC模型实现权限管理

在casbin中权限都是基于匹配规则和访问控制模型实现的&#xff0c;除了上一章的ACL的实现方式&#xff0c;还有一个常用的访问控制模型RBAC。该模型带上了用户角色&#xff0c;基本满足大多数角色管理的系统。 在RBAC模型中多了一个角色的策略机制&#xff0c;其访问模型规则如…

消息中间件 - RabbitMQ篇之入门及进阶

这里写自定义目录标题 一. RabbitMQ简介1.1. 消息中间件1.1.1.什么是消息中间件1.1.2.消息中间件的传递模式1. 1.2.1 点对点1. 1.2.2 发布订阅模式 1.1.3 消息中间件种类1.1.4 消息中间件的作用 2. RabbitMQ介绍2.1.RabbitMQ的起源2.2.RabbitMQ的安装及简单使用 3. RabbitMQ的简…

Unity UI -- (6)增加Toggle和Slider

在前面的小节中&#xff0c;我们已经有了一个空的设置菜单。现在让我们来添加设置选项。 在本节最后&#xff0c;我们的设置菜单的样子参考如下&#xff1a; 添加一个音乐开关&#xff08;Toggle&#xff09; 现在让我们来增加一个toggle&#xff0c;让用户能够通过它来对场景的…

多功能语音芯片​NV040C的应用,为洗地机开辟新的应用领域

随着科技的快速发展&#xff0c;智能化和自动化已经成为了各个行业发展的主流趋势。传统的家庭洗拖工作日渐被各类洗地机、扫地机器人等取代&#xff0c;其中作为洗地机作为近几年家庭清洁的好物。近年来&#xff0c;不少洗地机厂商开始将语音芯片技术应用到产品中&#xff0c;…

多商户商城系统开发功能优势与选择技巧

电商行业的持续发展&#xff0c;让越来越多的商家企业开始选择入驻多商户商城&#xff0c;通过该系统不仅能够为消费者提供更加便捷良好的购物体验&#xff0c;而且也能够为企业提供一个高效稳定的电商平台&#xff0c;可以说是未来电商行业发展的重要趋势。那么多商户商城系统…

Milk -v 开发板烧录系统以及ssh连接

Milk -v 开发板烧录系统以及ssh连接 0. 前言1. 系统下载2. 驱动安装3. ssh连接 0. 前言 操作系统&#xff1a;Windows10 专业版 开发板&#xff1a;Milk -v 准备读卡器、内存卡、Typec 数据线 Milk-V开发板官方文档 到手后它的外形和宣传图片是一致的&#xff0c;但是更加的…