[工程编写]CMakeLists.txt 如何编写

2023-05-16

最近开始写一些SLAM工程,所以对涉及到的内容做一些整理,那么要做的第一件事情就是编写一个CMakeLists.txt。本文那任乾大佬在知乎关于雷达自动驾驶SLAM的工程距离。

1 信息指定

①cmake版本确定:

cmake_minimum_required(VERSION 3.1.0)

②工程名:

project(lidar_localization)

③工程选项设置:

SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
add_compile_options(-std=c++11)
add_definitions(-std=c++11)

2 寻找依赖包

④findpackage:可以找到依赖包的头文件包含路径、库路径、库名字、版本号等,具体内容可以看该链接

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  pcl_ros
  geometry_msgs
  tf
  eigen_conversions
)

3 路径包含

include_directories:的作用为将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径,通常我们通过include_directories指定我们需要的文件所在路径来让程序知道程序在哪,详细内容看该链接

此时有一个include的妙用
由于各式各样的调用以及有时需要的if…else判断会导致CMakeLists很混乱,这时候将对每个包的调用内容写成一个.cmake文件放在一个固定的文件夹中,这是在CMakeLists中只要include这些.cmake文件即可,使得整个CMakeLists的结果很清晰。

include(cmake/glog.cmake)
include(cmake/PCL.cmake)
include(cmake/eigen.cmake)
include(cmake/geographic.cmake)

include_directories(include ${catkin_INCLUDE_DIRS})
include(cmake/global_defination.cmake)

4 添加执行文件

add_executable:基于给定的源文件创建可执行文件,具体内容可看该链接
由于添加的源文件可能很多将导致CMakeLists很冗杂,此时可以用一个变量存储所有需要的源文件,最后将这个变量给add_executable即可。

file(GLOB_RECURSE ALL_SRCS "*.cpp")
file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")
file(GLOB_RECURSE THIRD_PARTY_SRCS "third_party/*.cpp")
list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS})
list(REMOVE_ITEM ALL_SRCS ${THIRD_PARTY_SRCS})

add_executable(test_frame_node src/test_frame_node.cpp ${ALL_SRCS})

此处ALL_SRCS就是那个变量,通过file()创建以及list()增删。

5 连接库

target_link_libraries:将给定的库文件名称连接到刚才创建的可执行文件,具体内容可看该链接
同样的,当链接的库很多时也会导致CMakeList很冗杂,此时可以定义一个变量,在之前3中的include部分将需要的库合并到这个变量中,最后给到target_link_libraries即可

set(ALL_TARGET_LIBRARIES "")

...include 内容...

target_link_libraries(test_frame_node ${catkin_LIBRARIES} ${ALL_TARGET_LIBRARIES})

此处ALL_TARGET_LIBRARIES就是那个变量,在include写好的.cmake文件时会通过list(APPEND ALL_TARGET_LIBRARIES ${XX_LIBRARIES})将需要的库合并进来。

变量和选项

CMAKE_BUILD_TYPE:指定编译类型,常见的为Debug和Release
CMAKE_CXX_FLAGS_RELEASE:编译Release版本的时候采用的编译选项

add_compile_options():添加编译选项,同SET(CMAKE_CXX_FLAGS …) + SET(CMAKE_C_FLAGS)效果相同,例:add_compile_options(-std=c++11)即对c++和c编译时都加上c++11支持选项,链接
add_definitions():用于添加标志位,链接

最终CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(lidar_localization)

SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
add_compile_options(-std=c++11)
add_definitions(-std=c++11)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  pcl_ros
  geometry_msgs
  tf
  eigen_conversions
)
set(ALL_TARGET_LIBRARIES "")

include(cmake/glog.cmake)
include(cmake/PCL.cmake)
include(cmake/eigen.cmake)
include(cmake/geographic.cmake)

include_directories(include ${catkin_INCLUDE_DIRS})
include(cmake/global_defination.cmake)
catkin_package()

file(GLOB_RECURSE ALL_SRCS "*.cpp")
file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")
file(GLOB_RECURSE THIRD_PARTY_SRCS "third_party/*.cpp")
list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS})
list(REMOVE_ITEM ALL_SRCS ${THIRD_PARTY_SRCS})

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

[工程编写]CMakeLists.txt 如何编写 的相关文章

  • Linux基础命令(三)- cd

    注意 xff1a 使用cd命令需要清楚知道要去的目录以及Linux目录结构 一 cd命令 cd change directory 改变目录的意思 xff0c 切换文件夹 cd 当前目录下的目录名 进入指定的目录 xff08 如果当前没有那个
  • Linux基础命令(六)- mkdir / touch

    目录 十四 mkdir 创建文件夹 总结 语法一 xff1a 语法二 xff1a 创建多个目录 语法三 xff1a 创建嵌套的文件 语法四 xff1a 创建隐藏文件 十五 touch 创建文件 空文件 总结 语法一 xff1a 创建普通文件
  • Qt播放视频报错 DirectShowPlayerService::doRender: Unresolved error code 0x80040266

    没有插件报错 xff1a DirectShowPlayerService doRender Unresolved error code 0x80040266 如果文件路径不对或者文件名是中文的 xff0c 则会显示如下错误 xff1a Di
  • 树莓派使用(二)树莓派键盘布局,英式键盘换成没事键盘,解决#@无法输入问题

    树莓派键盘布局 xff0c 英式键盘换成没事键盘 xff0c 解决 64 无法输入问题 树莓派默认情况下 xff0c 输入 得到的是这个 符号 xff0c 输入 64 得到的是 34 这个符号 因为树莓派的系统默认是英文环境 xff0c 使
  • 阿里云Linux服务器安装可视化桌面,登录VNC提示Login incorrect*

    登录VNC提示Login incorrect 解决方法只要分为两步 xff1a 1 重置VNC密码 xff1a 先重置VNC密码 xff0c 重置后重启 xff0c 按照要求重置 xff0c 重置成功后会看到右上角出现一个重置成功的字样 2
  • 在计算机视觉论文中benchmark和baseline的区别

    总结 benchmark一般是和同行中比较牛的算法比较 xff0c 比牛算法还好 xff0c 那你可以考虑发好一点的会议 期刊 xff1b baseline一般是自己算法优化和调参过程中自己和自己比较 xff0c 目标是越来越好 xff0c
  • Gazebo仿真建模总结

    Gazebo仿真建模总结 目录 Gazebo仿真建模总结前言介绍总体框架框架介绍1 机器人模型urdf xacro2 模型运行平台rvizdisplayszh launch启动文件代码 xff1a 3 模型仿真平台gazebo1 xff09
  • c++工程中make和cmake的使用(CMakeLists.txt)

    一 make和cmake 1 make make xff0c 常指一条计算机指令 xff0c 可以从一个名为Makefile的文件中获得如何构建程序的依赖关系 通常项目的编译规则就定义在makrfile 里面 xff0c 比如 xff1a
  • 2. 阿里云上搭建ubuntu16.04并使用VNC进行远程连接

    首先 xff0c 用xshell连接阿里云 xff08 便于后续操作方便 xff09 参考文档 xff1a 阿里云服务器 xff08 Ubuntu16 04 64位 xff09 远程连接 再来创建新用户 参考文档 xff1a 为Ubuntu
  • 【哈工大李治军】操作系统课程笔记9:设备驱动与文件管理(显示器、键盘和磁盘)

    xff08 应粉丝催更 xff0c 笔记提前放出来了 xff0c 还剩最后一个视频 xff0c 等有空了再整理 xff09 1 I O与显示器 xff08 终端设备输出 xff09 本次所学的I O设备主要归为两大类 xff1a 键盘和显示
  • MathType7新版本数学公式编辑器上线功能特性

    许多论文或文献中含有大量较复杂的公式或者符号 xff0c 为了使文章中的公式符号更加规范 美观 xff0c 现在很多人选用MathType软件来编辑公式 MathType具有非常强大的公式编辑能力 xff0c 和我们常用的Office软件结
  • LDO:低压差线性稳压芯片

    LDO LDO即low dropout regulator xff0c 是一种 低压差 线性稳压器 这是相对于传统的线性稳压器来说的 传统的线性稳压器 xff0c 如78XX系列的芯片都要求输入电压要比输出电压至少高出2V 3V xff0c
  • git使用gitee 仓库教程详细

    1 先再本地创建 一个git 仓 先创建一个文件夹 在文件夹内运行git 执行git init 命令生成git 仓库 生成git 仓库之后 创建一个想要上传到云库的文件 xff0c 然后通过 git add 添加所有文件命令 添加跟踪 也叫
  • realsenseD435i运行vins-mono

    目录 写在前面准备编译vins mono 修改launch realsense vins mono 运行参考完 写在前面 1 本文内容 realsenseD435i运行vins mono 2 平台 ubuntu1804 ros melodi
  • Hive源码阅读--SQL的语法解析和语义分析--Driver

    前面五个类 xff0c 殊途同归都是CliDriver类 xff0c 他负责接受用户在命令行上输入的信息 xff0c 然后准备执行并将执行的结果返回 而真正底层干事情的是Driver xff0c 他将接受到的命令编译 xff0c 优化为MR
  • C语言字符串结束符“\0”

    C语言字符串结束符 0
  • STM32 PCB设计

    看了自己2018年2月画的PCB和现在2019年7月画的PCB xff0c 不多说了 不多说了 不多说了上图 96 2018年2月 96 2019年7月 大家可以明显看到第一块板子简直就是惨不忍睹 说几点PCB设计注意事项和自己的感想 xf
  • Java 调用第三方接口方法

    Java 调用第三方接口方法 一 通过JDK网络类Java net HttpURLConnection 1 java net包下的原生java api提供的http请求 使用步骤 xff1a 1 通过统一资源定位器 xff08 java n
  • docker基本命令及使用实例

    docker基本命令 特别鸣谢 xff1a B站up主 狂神说java的视频 xff0c 让我能短时间了解docker docker文件系统 docker镜像为分层设计 xff0c 相比于全量的虚拟机镜像 xff0c 少了引导程序bootf
  • ubantu 系统分区介绍

    假设分区有40个G 1 500M引导分区 2 10个G的swap分区 swap是一个内存交换空间 xff0c 当内存溢出 xff0c 或者计算机打算休眠的时候 会将数据存在swap分区中 在windows系统中是三个文件 swap的大小通常

随机推荐

  • H3C交换机常用命令(初学)

    一 显示交换机当前的一些配置信息 1 display current configuration 显示当前的一些配置信息 xff0c 如vlan xff0c 端口详细信息 2 display saved configuration 显示下次
  • Linux下的Tcp通信项目范例【demo】

    一 适合阅读对象 2 4个月的初学者 C语言编程方向 xff09 二 项目内容 xff1a 设计一个可以符合多用户进行线上查阅乐器的商城 xff0c 要求可以多个用户查看 xff0c 管理员可随时修改内容 xff0c 普通用户仅可查看 xf
  • 平衡小车之陀螺仪调参

    一 平衡小车 平衡小车作为控制进阶 xff0c 成为每个学习PID控制算法者的必经之路 xff0c 可难可易 xff0c 找到方法则非常容易 xff0c 找不到方法可能盲调数天也没有收获 要让小车平衡 xff0c 我认为需要掌握的技能有几点
  • 常用的字符函数和字符串函数

    一 分类 求字符串长度 xff1a strlen长度不受限制的字符串函数 xff1a strcpy strcat strcmp长度受限制的字符串函数 xff1a strncpy strncat strncmp字符串查找 xff1a strs
  • 成功解决Command "python setup.py egg_info" failed with error code 1 in C:\Users\AppData\

    成功解决Command amp quot python setup py egg info amp quot failed with error code 1 in C Users AppData 目录 解决问题 解决方法 解决问题 Com
  • 解决JetPack4.2 自制载板无法开机

    使用下面方法会导致无法连接显示器 xff01 xff01 xff01 1 源码下载 https developer nvidia com embedded downloads 选择 L4T Sources 下载 L4T JAX and TX
  • Android开发技巧 (五) —— Lambda表达式

    Lambda表达式本质是一种匿名方法 xff0c 它既没有方法名 xff0c 也没有访问修饰符和返回值类型 xff0c 用它来写代码更简洁 xff0c 更易懂 Lambda是Java8的新特性 xff0c 所以要在app build gar
  • 树莓派4B安装ubuntu mate20 +putty和vncsever远程登录+安装ROS

    新买了树莓派4B xff0c 安装环境费了好大功夫 xff0c 终于找到一套可以用的方案 xff0c 记录一下 基本 xff1a 树莓派4B一块64G内存卡电源 显示器 鼠标 键盘 安装系统和换软件源 参考树莓派4B安装Ubuntu Mat
  • jsp医疗辅助诊断管理系统servlet开发mysql数据库web结构java编程计算机网页项目

    一 源码特点 JSP医疗辅助诊断管理系统是一套完善的java web信息管理系统 xff0c 对理解JSP java编程开发语言有帮助serlvet 43 dao 43 bean 模式开发 xff0c 系统具有完整的源代码和数据库 xff0
  • MATLAB2019a中文设置的一些说明

    MATLAB2019a中文设置的一些说明 问题 xff1a 今天打开matlab发现是英文的 xff0c 想要修改成中文 网上方法 xff1a preferences xff08 预设项 xff09 General xff08 常规 xff
  • ERROR: Could not install packages due to an EnvironmentError: [Errno 13] 权限不够的解决办法

    关于错误 xff1a ERROR Could not install packages due to an OSError Errno 13 Permission denied 39 usr local label cn txt 39 Co
  • 每天进步一点点(一)

    1 说一下sram xff0c flash memory xff0c 及dram的区别 xff1f sram xff1a 静态随机存储 这里的静态是指这种存储器只需要保持通电 xff0c 里面的数据就可以永远保持 但是当断电之后 xff0c
  • GPS载频信号简述(L1、L2、L3、L5)

    L1 1575 42 1 023MHzL2 1227 60 1 023MHz L3 用途和频率暂未公开 资料显示其用于发现核爆炸或其他高能量红外辐射事件的核爆炸侦察系统 NDS 平台提供通讯联系 L5 1176 45 1 023MHz xf
  • Ajax详解及使用Ajax时的返回值类型有哪些?

    Ajax详解 Ajax 61 异步 JavaScript 和 XML Ajax 是一种用于创建快速动态网页的技术 通过在后台与服务器进行少量数据交换 xff0c Ajax 可以使网页实现异步更新 这意味着可以在不重新加载整个网页的情况下 x
  • ubuntu20.04双系统分区

    一 分四个区 xff0c 记录下 主分区和逻辑分区目前感觉没啥影响 但是有的电脑可能数量会有限制 boot引导分区 500M 交换分区 xff0c 16G及以下与内存大小一致 根目录 xff0c 如果要安装cuda之类的尽量50G以上吧 其
  • Vins-Fusion运行kitti,euroc和tum数据集并使用evo评估

    基于ubuntu18 04 VIns Fusion 1 修改程序输出位姿信息修改为TUM格式 为了方便评估 xff0c 先将程序的输出位姿信息修改为tum格式 xff0c 需要做如下改动 1 1 回环输出位姿文件pose graph cpp
  • JETSON ORIN NX 烧录系统镜像

    所需环境 xff1a Ubuntu 操作系统 本方法适用于SDKManager 找不到套件的情况 xff01 解决方法如下 xff1a 进入NVIDIA官网 xff08 Jetson Linux 35 2 1 NVIDIA Develope
  • 解决Komodo上自带D435可以打开而外接D435i打不开的原因

    解决Komodo上自带D435可以打开而外接D435i打不开的原因 因为Komodo上装的realsense SDK 和realsense ros版本不对应以及版本太低的原因 xff0c 所以各种问题 按照realsense和realsen
  • C++泛型编程,标准模板库(STL)

    C 43 43 的特点就是添加了面向对象和泛型 面向对象是用类实现的 xff0c 泛型是用模板实现的 xff0c C 43 43 的标准模板库 STL 是泛型一个实例 xff0c 已经被集成到C 43 43 xff0c STL是一些常用的数
  • [工程编写]CMakeLists.txt 如何编写

    最近开始写一些SLAM工程 xff0c 所以对涉及到的内容做一些整理 xff0c 那么要做的第一件事情就是编写一个CMakeLists txt 本文那任乾大佬在知乎关于雷达自动驾驶SLAM的工程距离 1 信息指定 cmake版本确定 xff