CMake中CMakeLists文件的编写以及变量打印

2023-05-16

最近在学习PCL,在Win10下使用VS编写PCL程序,配置环境时经常出错,踩坑记录详见:Win10+VS2017+PCL_1.8.1软件安装​​踩坑记录

看到《点云库PCL从入门到精通》书中使用的都是cmke,发现使用cmake更加简洁快速,不易出错,测试记录:Win10下使用Cmake编译PCL工程文件测试

CMakeLists文件的编写

使用cmake,最关键的一步就是编写CMakeLists文件。遂把PCL中常用的命令记录。

CMakeLists.txt文件示例:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(pcd_write)

find_package(PCL 1.2 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (pcd_write pcd_write.cpp)
target_link_libraries (pcd_write ${PCL_LIBRARIES})

解释: 

定义最小版,这是强制性的cmake,因为正在做一个非常基本的项目,不需要从cmake 2.8或更高的功能。
cmake_minimum_required(version 2.8 FATAL_ERROR)

项目名称
project(pcd_write) //这里的pcd_write为工程文件夹名称

find_package()命令是用来查找依赖包的,可以把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到
find_package(PCL 1.2 REQUIRED)

我们要求找到最低版本为1.2的PCL软件包,如果找不到,将失败

由于PCL是模块化的,因此可以:

  • 只有一个组件: find_package(PCL 1.3 REQUIRED COMPONENTS io)
  • 一些: find_package(PCL 1.3 REQUIRED COMPONENTS io common)
  • 所有已存在: find_package(PCL 1.3 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})  

 当PCL被找到,一些相关的变量将会被设置:

  • PCL_FOUND:如果找到PCL,则设置为1,否则未设置

  • PCL_INCLUDE_DIRS:设置为PCL安装的标头和依赖标头的路径

  • PCL_LIBRARIES:设置为已建立和已安装的PCL库的文件名

  • PCL_LIBRARY_DIRS:设置为PCL库和第3方依赖关系所在的路径

  • PCL_VERSION:找到的PCL的版本

  • PCL_COMPONENTS:列出所有可用的组件

  • PCL_DEFINITIONS:列出所需的预处理程序定义和编译器标志

要让cmake知道在项目中包含的外部头文件,你需要使用include_directories宏。在我们的例子中,PCL_INCLUDE_DIRS包含了我们需要的内容,因此我们要求cmake搜索它包含的路径,以查找可能包含的头文件。

include_directories(${PCL_INCLUDE_DIRS})
参数形式 *_INCLUDE_DIRS,变量为 find_package路径和其他需要包含的路径
 

link_directories(${PCL_LIBRARY_DIRS})
用来加载外加的库函数路径,链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。

add_excutable(pcd_write pcd_write.cpp)
使用给定的源文件,为工程引入一个可执行文件

这里,我们告诉cmake我们试图从一个源文件pcd_write.cpp中创建一个名为pcd_write的可执行文件。CMake将添加后缀(Windows平台上的.exe和UNIX上的blank)和权限。

add_dependencies()
一般来说用不到。用到的情况就是两个targets有依赖关系(通过target_link_libraries解决)并且依赖库也是通过编译源码产生的。这时候一句add_dependencies可以在直接编译上层target时,自动检查下层依赖库是否已经生成。没有的话先编译下层依赖库,然后再编译上层target,最后link depend target

target_link_libraries(pcd_write ${PCL_LIBRARIES})
添加链接库;将目标文件与库文件进行链接.

我们正在构建的可执行文件调用PCL函数。到目前为止,我们只包含了PCL头文件,因此编译器知道我们正在调用的方法。我们还需要让链接器知道我们所链接的库。如前所述,使用PCL libraries变量引用PCL找到的库,剩下的就是触发我们调用目标链接库()宏所做的链接操作。

PCLConfig.cmake使用名为EXPORT的CMake特殊功能,该功能允许您使用其他项目目标,就像您自己构建它们一样。 使用此类目标时,它们称为导入目标,其作用与其他任何目标一样。

Cmake变量的打印

Cmake中打印消息方法为message,用于编译时期在cmake项目中输出日志信息,也可用于断点调试时,随时查看日志信息。 

message([<mode>] "message to display" ...)

message:消息名字,可在CMakeLists.txt或者.cmake脚本文件中输入,且有提示,不区分大小写
mode:打印消息的类别,有FATAL_ERROR,SEND_ERROR,WARNING,AUTHOR_WARNING,DEPRECATION,(none) or NOTICE,STATUS,VERBOSE,DEBUG,TRACE共10种
“message to display”:输出消息的内容,是字符串类型
…:表示可变参数,可连接多个输出

Mode- 打印消息的类别

  • FATAL_ERROR:cmake出错,停止编译和生成(信息红色)
  • SEND_ERROR:cmake出错,继续编译,但是停止生成(信息红色)
  • WARNING:cmake警告,继续编译(信息红色)
  • AUTHOR_WARNING:开发者警告,继续编译(信息红色)
  • DEPRECATION:如果使用set方法设置CMAKE_ERROR_DEPRECATED为true(不区分大小写),编译出错,否则继续编译
  • (none) or NOTICE:不设置mode,默认是NOTICE模式,不影响编译和生成,用于打印消息(信息白色)
  • STATUS:编译时状态信息,左边以--开头(信息白色)
  • DEBUG:针对开发人员的调试信息(信息白色)
  • TRACE:日志级别的临时信息(信息白色)
     

 使用示例:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(pcd_test)

find_package(PCL 1.2 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})


SET(HELLO "Hello World")
MESSAGE( STATUS "Hello = ${HELLO}.")
MESSAGE( STATUS "PCL_FOUND = ${PCL_FOUND}.")
MESSAGE( STATUS "PCL_INCLUDE_DIRS = ${PCL_INCLUDE_DIRS}.")
MESSAGE( STATUS "PCL_LIBRARIES = ${PCL_LIBRARIES}.")
MESSAGE( STATUS "PCL_LIBRARY_DIRS = ${PCL_LIBRARY_DIRS}.")
MESSAGE( STATUS "PCL_VERSION = ${PCL_VERSION}.")
MESSAGE( STATUS "PCL_COMPONENTS = ${PCL_COMPONENTS}.")
MESSAGE( STATUS "PCL_DEFINITIONS = ${PCL_DEFINITIONS}.")

add_executable (pcd_test pcd_test.cpp)
target_link_libraries (pcd_test ${PCL_LIBRARIES})

输出结果:

Hello = Hello World.
PCL_FOUND = 1.
PCL_INCLUDE_DIRS = D:/PCL191/include/pcl-1.9;D:/PCL191/3rdParty/Eigen/eigen3;D:/PCL191/3rdParty/Boost/include/boost-1_68;D:/PCL191/3rdParty/FLANN/include;D:/PCL191/3rdParty/VTK/include/vtk-8.1;D:/PCL191/3rdParty/OpenNI2/Include;D:/PCL191/3rdParty/Qhull/include.
PCL_LIBRARIES = pcl_common;pcl_kdtree;pcl_octree;pcl_search;pcl_sample_consensus;pcl_filters;pcl_io;pcl_features;pcl_ml;pcl_segmentation;pcl_visualization;pcl_surface;pcl_registration;pcl_keypoints;pcl_tracking;pcl_recognition;pcl_stereo;pcl_outofcore;pcl_people;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_system-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_system-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_filesystem-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_filesystem-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_thread-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_thread-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_date_time-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_date_time-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_iostreams-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_iostreams-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_serialization-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_serialization-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_chrono-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_chrono-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_atomic-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_atomic-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Boost/lib/libboost_regex-vc141-mt-x64-1_68.lib;debug;D:/PCL191/3rdParty/Boost/lib/libboost_regex-vc141-mt-gd-x64-1_68.lib;optimized;D:/PCL191/3rdParty/Qhull/lib/qhullstatic.lib;debug;D:/PCL191/3rdParty/Qhull/lib/qhullstatic_d.lib;D:/PCL191/3rdParty/OpenNI2/Lib/OpenNI2.lib;optimized;D:/PCL191/3rdParty/FLANN/lib/flann_cpp_s.lib;debug;D:/PCL191/3rdParty/FLANN/lib/flann_cpp_s-gd.lib;vtksys;vtkCommonCore;vtkCommonMath;vtkCommonMisc;vtkCommonSystem;vtkCommonTransforms;vtkCommonDataModel;vtkCommonColor;vtkCommonExecutionModel;vtkCommonComputationalGeometry;vtkFiltersCore;vtkFiltersGeneral;vtkImagingCore;vtkImagingFourier;vtkalglib;vtkFiltersStatistics;vtkFiltersExtraction;vtkInfovisCore;vtkFiltersGeometry;vtkFiltersSources;vtkRenderingCore;vtkzlib;vtkfreetype;vtkRenderingFreeType;vtkRenderingContext2D;vtkChartsCore;vtkDICOMParser;vtklz4;vtkIOCore;vtkIOLegacy;vtkexpat;vtkIOXMLParser;vtkDomainsChemistry;vtkIOXML;vtkParallelCore;vtkFiltersAMR;vtkFiltersFlowPaths;vtkFiltersGeneric;vtkImagingSources;vtkFiltersHybrid;vtkFiltersHyperTree;vtkImagingGeneral;vtkFiltersImaging;vtkFiltersModeling;vtkFiltersParallel;vtkFiltersParallelImaging;vtkFiltersPoints;vtkFiltersProgrammable;vtkFiltersSMP;vtkFiltersSelection;vtkFiltersTexture;vtkFiltersTopology;verdict;vtkFiltersVerdict;vtkmetaio;vtkjpeg;vtkpng;vtktiff;vtkIOImage;vtkImagingHybrid;vtkInfovisLayout;vtkInteractionStyle;vtkImagingColor;vtkRenderingAnnotation;vtkRenderingVolume;vtkInteractionWidgets;vtkViewsCore;vtkproj4;vtkGeovisCore;vtkhdf5_hl;vtkhdf5;vtkIOAMR;vtkIOEnSight;vtkNetCDF;vtkexoIIc;vtkIOExodus;vtkRenderingOpenGL;vtkRenderingContextOpenGL;vtkgl2ps;vtkRenderingGL2PS;vtklibharu;vtkIOExport;vtkRenderingLabel;vtkIOExportOpenGL;vtkIOGeometry;vtkIOImport;vtklibxml2;vtkIOInfovis;vtkIOLSDyna;vtkIOMINC;vtkoggtheora;vtkIOMovie;vtknetcdfcpp;vtkIONetCDF;vtkIOPLY;vtkjsoncpp;vtkIOParallel;vtkIOParallelXML;vtksqlite;vtkIOSQL;vtkIOTecplotTable;vtkIOVideo;vtkImagingMath;vtkImagingMorphological;vtkImagingStatistics;vtkImagingStencil;vtkInteractionImage;vtkRenderingImage;vtkRenderingLIC;vtkRenderingLOD;vtkRenderingVolumeOpenGL;vtkViewsContext2D;vtkViewsInfovis.
PCL_LIBRARY_DIRS = D:/PCL191/lib.
PCL_VERSION = 1.9.1.
PCL_COMPONENTS = pcl_common;pcl_kdtree;pcl_octree;pcl_search;pcl_sample_consensus;pcl_filters;pcl_io;pcl_features;pcl_ml;pcl_segmentation;pcl_visualization;pcl_surface;pcl_registration;pcl_keypoints;pcl_tracking;pcl_recognition;pcl_stereo;pcl_outofcore;pcl_people.
PCL_DEFINITIONS = -D__SSSE3__;-D__SSE2__;-D__SSE__;-DBOOST_ALL_NO_LIB.

参考链接:

Using PCL in your own project — Point Cloud Library 0.0 documentation

https://blog.csdn.net/Calvin_zhou/article/details/104025714

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake中CMakeLists文件的编写以及变量打印 的相关文章

随机推荐

  • USB协议概念学习

    1 USB总线结构 usb的总线拓扑结构如下所示 xff1a 从USB总线结构可以看出 xff0c 主要由3部分组成 xff1a USB主机 Host USB线缆 USB设备 hub Func等 USB主机 xff1a 一般成为USB Ho
  • 创新工场两道笔试题0919

    题目1 字符串去重 xff0c 老题目 xff0c 只是要求不能开辟新空间用来复制原字符串 思路 xff1a 使用布尔型的简单hash表可以节省空间 xff0c 用来存储字符是否出现的信息 xff0c 刚开始hash表里面都是false x
  • ROS仿真机器人学习笔记二:创建4轮小车模型及相关xraco文件修改

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 例如 xff1a 第一章 Python 机器学习入门之pandas的使用 提示 xff1a 写完文章后 xff0c 目录可以自动生成 x
  • 旧电脑升级Windows11时检查CPU和TPM2.0不满足的解决方案(慎重)

    上个月微软发布了Windows11 22H2正式版 xff0c 不少新电脑也接收到了推送 xff0c 楼主的台式 xff08 i3 8100 军规星H310M xff09 也接收到了推送 xff0c 但是碍于Win11蛋疼的右键和状态栏消息
  • windows下安装docker

    windows下安装docker 0 前置条件 环境说明 xff1a windows11 家庭中文版 开启Hyper V xff08 可以百度如何开启 xff09 如何添加Hyper V 创建hyper txt xff0c 复制如下内容 x
  • STM32CubeMX配置生成FreeRTOS项目

    文章目录 1 安装STM32CubeMX软件1 1 下载安装1 2 安装要用到的芯片软件包 2 配置FreeRTOS项目2 1 创建工程2 2 配置SYS2 3 配置RCC2 4 配置系统运行时钟2 5 配置UART1串口作为调试代码2 6
  • ScrumMaster的教练职责

    ScrumMaster是Scrum团队的敏捷教练 Ken Rubin说 xff0c 类似于运动团队的教练 xff0c ScrumMaster观察团队使用Scrum的过程 xff0c 帮助团队提高工作绩效 教练不是顾问 xff0c 不提供解决
  • Autoware.Auto avp仿真详解

    1 定位 定位节点启动的是 ndt localizer 61 Node package 61 39 ndt nodes 39 executable 61 39 p2d ndt localizer exe 39 namespace 61 39
  • VMware + ubuntu16.04 + ROS kinetic 下配置realsense D435i 遇到的问题

    在配置Realsense D435i 的过程中 xff0c 遇到一个问题 执行 scripts patcg realsebse ubuntu lts sh 下载速度奇慢 10K s左右 而且会在接受到36 的时候不动了 xff0c 等了一晚
  • 白话tensorflow分布式部署和开发

    关于tensorflow的分布式训练和部署 xff0c 官方有个英文的文档介绍 xff0c 但是写的比较简单 xff0c 给的例子也比较简单 xff0c 刚接触分布式深度学习的可能不太容易理解 在网上看到一些资料 xff0c 总感觉说的不够
  • 全息投影技术

    1 概念 全息投影技术 xff08 front projectedholographic display xff09 也称 虚拟成像 技术是利用干涉和衍射原理记录并再现物体真实的 三维 图像的技术 全息投影技术不仅可以产生立体的空中幻像 x
  • Ardupilot飞控添加使用诺瓦泰GPS

    Ardupilot飞控添加使用诺瓦泰双天线GPS航向角的设置 一 添加诺瓦泰GPS heading角数据包解析代码 1 打开libraries AP GPS AP GPS NOVA h xff0c 添加如下代码 xff1a struct P
  • SD标准以及规范

    SD标准及规范 SD应用 SD标准让制造商能生产高性能之产品来提升数百万计消费者的体验 xff0c 包含听音乐 录制视频 摄影 数据储存以及使用移动电话 身为一个产业的标准 xff0c SD标准被用于行动存储产业的多个市场领域中 xff0c
  • 《视觉SLAM十四讲》学习笔记-状态估计问题

    最大后验与似然 经典slam模型可表示为 xff1a x k 61 f x k 1 u k 43 w k z k j 61 h y j x k 43 v
  • 机器人学领域的顶级期刊和会议

    印象中 xff0c 机器人学涉及机械 控制 计算机和电子等领域 xff0c 十足的交叉学科 xff0c 所以涉及到的概念和技术也非常多 因工作关系 xff0c 看了三周的SLAM入门 xff0c 用的是高翔的 视觉SLAM十四讲 这本教材
  • SQL解析过程

    转载自 xff1a http blog aliyun com 733 简介 SQL任务是ODPS中使用最频繁的一类作业 大部分用户开始使用ODPS时要做的第一件事情就是学习怎么写ODPS的SQL ODPS SQL是一种非常灵活的语言 兼容大
  • C++中类所占的内存大小以及成员函数的存储位置

    类所占内存的大小是由成员变量 xff08 静态变量除外 xff09 决定的 xff0c 虚函数指针和虚基类指针也属于数据部分 xff0c 成员函数是不计算在内的 因为在编译器处理后 xff0c 成员变量和成员函数是分离的 成员函数还是以一般
  • 用于异常检测的深度神经网络模型融合

    用于异常检测的深度神经网络模型融合 在当今的数字时代 xff0c 网络安全至关重要 xff0c 因为全球数十亿台计算机通过网络连接 近年来 xff0c 网络攻击的数量大幅增加 因此 xff0c 网络威胁检测旨在通过观察一段时间内的流量数据来
  • STM32CubeIDE构建通用freertos项目(一)

    感慨 本人大约三四年没有碰单片机了 xff0c 遥想当年我还是用的keil工具 有幸以援助的身份介入公司的嵌入式项目 xff0c 结合自身经验讲讲 工作是一个长期的过程 xff0c 开头不注意则会产生蝴蝶效应 xff0c 导致接下来的工作一
  • CMake中CMakeLists文件的编写以及变量打印

    最近在学习PCL xff0c 在Win10下使用VS编写PCL程序 xff0c 配置环境时经常出错 xff0c 踩坑记录详见 xff1a Win10 43 VS2017 43 PCL 1 8 1软件安装 踩坑记录 看到 点云库PCL从入门到