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

简介: 【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)

gcc编译

静态链接库(Static Linking Library):在链接步骤中,链接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库。在Windows上是 .lib 文件,在Unix-like系统上是 .a 文件。

动态链接库(Dynamic Linking Library):程序编译链接阶段,动态链接库不会被整合到可执行文件中,而是会在程序运行时动态加载。在Windows上是 .dll 文件,在Unix-like系统上是 .so 文件。

1.创建

使用以下命令在主文件夹中创建目录:d2lros2/chapt2/basic/

mkdir -p d2lros2/chapt2/basic/

创建后可以查看到:

接着键入:

code d2lros2


这行代码是安装VSCode后,VS Code 提供的一个命令行工具,允许用户从命令行快速打开或创建文件和项目。

然后在VSCode中刚才创建的目录下新建文件first_ros2_node.cpp:

向其中键入:

#include "rclcpp/rclcpp.hpp"

 

int main(int argc, char **argv)

{

   // 调用rclcpp的初始化函数

   rclcpp::init(argc, argv);

   // 调用rclcpp的循环运行我们创建的first_node节点

   rclcpp::spin(std::make_shared<rclcpp::Node>("first_node"));

   return 0;

}

简要说明:


其中rclcpp.hpp是ROS2中最核心也最基础的头文件,它包含了 ROS 2 节点、执行器、计时器、参数、服务、订阅者和发布者等核心功能的声明。

.hpp 扩展名清楚地表明这是一个 C++ 头文件。这有助于区分 C 头文件(.h)和 C++ 头文件。

rclcpp::init(argc, argv);用以初始化 ROS 2 系统并解析命令行参数。这是在使用任何其他 ROS 2 功能之前必须调用的函数。

rclcpp::spin 是一个阻塞调用,它会保持节点运行,直到节点被关闭或者程序被终止。其内部传入使用智能指针 std::shared_ptr创建的节点。

总的来说,这段程序仅仅创建了一个空节点。

2.编译

我们在终端中键入:


g++ first_ros2_node.cpp

使用g++来编译刚写的C++文件。不出意外一定会报错No such file or directory,这是因为编译器无法定位到我们代码中所包含的头文件。




所以我们可以使用下列命令为编译器指定这个头文件的目录:


g++ first_ros2_node.cpp -I /opt/ros/jazzy/include/rclcpp/

注意,这里要根据安装的ROS的版本不同选择不同目录下的命令。如果你的ROS代号为Humble,则需要把上述命令中的jazzy换为humble。

但当我们执行完后还是会报错,这是因为还有关联的其他头文件没有包含进来。

于是:g++ first_ros2_node.cpp \

-I/opt/ros/jazzy/include/rclcpp/ \

-I /opt/ros/jazzy/include/rcl/ \

-I /opt/ros/jazzy/include/rcutils/ \

-I /opt/ros/jazzy/include/rmw \

-I /opt/ros/jazzy/include/rcl_yaml_param_parser/ \

-I /opt/ros/jazzy/include/rosidl_runtime_c \

-I /opt/ros/jazzy/include/rosidl_typesupport_interface \

-I /opt/ros/jazzy/include/rcpputils \

-I /opt/ros/jazzy/include/builtin_interfaces \

-I /opt/ros/jazzy/include/rosidl_runtime_cpp \

-I /opt/ros/jazzy/include/tracetools \

-I /opt/ros/jazzy/include/rcl_interfaces \

-I /opt/ros/jazzy/include/libstatistics_collector \

-I /opt/ros/jazzy/include/statistics_msgs \

-I /opt/ros/jazzy/include/service_msgs/ \

-I /opt/ros/jazzy/include/type_description_interfaces/ \

-I /opt/ros/jazzy/include/rosidl_dynamic_typesupport/ \

-I /opt/ros/jazzy/include/rosidl_typesupport_introspection_cpp/

这里的“\”是换行符。


运行完后错误变成了undefined reference to xxxxx,即无法定位到库文件,如下:


ROS2的库文件都在:/opt/ros/jazzy/lib目录下

我们可以通过通过-L参数指定库目录,-l(小写L)指定库的名字。

于是可以在上面的那串命令下加上:-L /opt/ros/humble/lib/ \ -lrclcpp -lrcutils

g++ first_ros2_node.cpp \

-I/opt/ros/jazzy/include/rclcpp/ \

-I /opt/ros/jazzy/include/rcl/ \

-I /opt/ros/jazzy/include/rcutils/ \

-I /opt/ros/jazzy/include/rmw \

-I /opt/ros/jazzy/include/rcl_yaml_param_parser/ \

-I /opt/ros/jazzy/include/rosidl_runtime_c \

-I /opt/ros/jazzy/include/rosidl_typesupport_interface \

-I /opt/ros/jazzy/include/rcpputils \

-I /opt/ros/jazzy/include/builtin_interfaces \

-I /opt/ros/jazzy/include/rosidl_runtime_cpp \

-I /opt/ros/jazzy/include/tracetools \

-I /opt/ros/jazzy/include/rcl_interfaces \

-I /opt/ros/jazzy/include/libstatistics_collector \

-I /opt/ros/jazzy/include/statistics_msgs \

-I /opt/ros/jazzy/include/service_msgs/ \

-I /opt/ros/jazzy/include/type_description_interfaces/ \

-I /opt/ros/jazzy/include/rosidl_dynamic_typesupport/ \

-I /opt/ros/jazzy/include/rosidl_typesupport_introspection_cpp/ \

-L /opt/ros/jazzy/lib/ \

-lrclcpp -lrcutils

执行完以上命令后会产生一个目标文件

此时即为编译成功。

3.运行

键入以下命令,在执行当前目录下的a.out文件

./a.out

在新终端下键入下列命令即可查看运行结果:

ros2 node list

至此,你不仅创建了第一个ROS节点,而且还学会了Linux下gcc的编译方法。




相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
24天前
|
存储 安全 Linux
|
26天前
|
Linux Shell 数据安全/隐私保护
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
97 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
27天前
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
39 0
|
2月前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
|
14天前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
103 6
|
15天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
57 3
|
15天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
47 2
|
23天前
|
缓存 监控 Linux
|
10天前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
40 3