【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)

目录

零.前置篇章

一.Cmake的由来

二.安装

三.创建并编写CMakeLists.txt

四.编译

五.优化CMakeLists.txt文件


零.前置篇章

  1. 【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)_ros linux-CSDN博客
  2. 【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)_linux和ros-CSDN博客

一.Cmake的由来

CMake 是一个跨平台的安装(编译)工具,它使用简单的声明性语句描述所有平台的安装(编译过程)。

Cmake可以自动生成MakeFile,其通过调用CMakeLists.txt直接生成Makefile。

二.安装

cpp 复制代码
sudo apt install cmake

三.创建并编写CMakeLists.txt

在d2lros2/d2lros2/chapt2/basic下使用vim编辑器新建CMakeList.txt文件:

向其中写入:

cpp 复制代码
cmake_minimum_required(VERSION 3.22)

project(first_node)

include_directories(/opt/ros/jazzy/include/rclcpp/)
include_directories(/opt/ros/jazzy/include/rcl/)
include_directories(/opt/ros/jazzy/include/rcutils/)
include_directories(/opt/ros/jazzy/include/rmw)
include_directories(/opt/ros/jazzy/include/rcl_yaml_param_parser/)
include_directories(/opt/ros/jazzy/include/rosidl_runtime_c)
include_directories(/opt/ros/jazzy/include/rosidl_typesupport_interface)
include_directories(/opt/ros/jazzy/include/rcpputils)
include_directories(/opt/ros/jazzy/include/builtin_interfaces)
include_directories(/opt/ros/jazzy/include/rosidl_runtime_cpp)
include_directories(/opt/ros/jazzy/include/tracetools)
include_directories(/opt/ros/jazzy/include/rcl_interfaces)
include_directories(/opt/ros/jazzy/include/libstatistics_collector)
include_directories(/opt/ros/jazzy/include/statistics_msgs)
include_directories(/opt/ros/jazzy/include/service_msgs/)
include_directories(/opt/ros/jazzy/include/type_description_interfaces/)
include_directories(/opt/ros/jazzy/include/rosidl_dynamic_typesupport/)
include_directories(/opt/ros/jazzy/include/rosidl_typesupport_introspection_cpp/)

link_directories(/opt/ros/jazzy/lib/)

add_executable(first_node first_ros2_node.cpp)

target_link_libraries(first_node rclcpp rcutils)
  • **include_directories**是CMake构建系统中用来指定头文件搜索路径的命令。当你使用这个命令时,你告诉CMake在编译项目时要包含哪些目录,以便编译器可以找到所需的头文件(.h文件)。
  • link_directories 用于指定链接器搜索库文件(例如 .a 或 .so 文件)的目录。当你需要链接到不在默认搜索路径中的库时,这个命令非常有用。
  • add_executable 是 CMake 中用于定义可执行文件的命令。当你使用 CMake 来构建一个项目时,你需要告诉 CMake 你想要构建哪些可执行文件,以及这些可执行文件是由哪些源文件编译而成的。
  • target_link_libraries 用于指定目标(比如可执行文件或库)需要链接的库。当你定义了一个或多个可执行文件或库,并且它们依赖于其他库时,你需要使用 target_link_libraries 来告诉 CMake 如何将它们链接起来。

四.编译

这里我们先创建一个项目代码下的新目录build:

cpp 复制代码
mkdir build
cd build

在上级目录下找到CMakeList.txt文件,然后运行:

cpp 复制代码
cmake ..

由于我们是在build目录下运行的命令,于是运行CMake后生成的makefile就保存在了build下:

在build目录下运行make编译:

cpp 复制代码
make

然后在build目录下就生成了first_node节点

五.优化CMakeLists.txt文件

我们需要先了解一下find_package命令:

find_package 是CMake中的一个命令,用于查找并加载外部项目的配置。在CMake中,当你想要使用其他库或项目时,find_package会尝试在系统中找到这些依赖项,并设置必要的变量以便在当前项目中使用它们。

其将通过以下环境变量来指定查找路径:

cpp 复制代码
<package>_DIR
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
PATH

于是我们可以把以上CMake文件修改为:

cpp 复制代码
cmake_minimum_required(VERSION 3.22)

project(first_node)

find_package(rclcpp REQUIRED)
add_executable(first_node first_ros2_node.cpp)
target_link_libraries(first_node rclcpp::rclcpp)

接着也可以编译:

cpp 复制代码
cmake ..
make
相关推荐
2603_965148115 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
Android系统攻城狮5 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
快乐的韭菜根根6 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
U-Mail邮件系统7 小时前
自建邮箱服务器有哪些软件?三款主流邮件服务器软件推荐
运维·服务器
kaixin_啊啊7 小时前
【用于更准确 G×E 基因组预测的大规模作物数据集与基于深度学习的多模态融合框架】论文学习
人工智能·深度学习·学习
xier_ran8 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
倒头就睡的小比特8 小时前
Linux基础指令3
linux·服务器
天远数科8 小时前
零信任架构实战:基于天远贷前风险报告构建自动化消金信贷风控与多头共债排查网关
运维·人工智能·架构·自动化
梦帮科技8 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
半杯咖啡半行码9 小时前
Linux 驱动开发入门:内核模块编程基础
linux·服务器·网络