【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/
相关文章
|
5天前
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
13 0
Linux c/c++之多文档编译
|
13天前
|
网络协议 Linux
linux学习之套接字通信
Linux中的套接字通信是网络编程的核心,允许多个进程通过网络交换数据。套接字提供跨网络通信能力,涵盖本地进程间通信及远程通信。主要基于TCP和UDP两种模型:TCP面向连接且可靠,适用于文件传输等高可靠性需求;UDP无连接且速度快,适合实时音视频通信等低延迟场景。通过创建、绑定、监听及读写操作,可以在Linux环境下轻松实现这两种通信模型。
17 1
|
1月前
|
Linux
用clang编译Linux内核
用clang编译Linux内核
|
1月前
|
Linux
使用qemu来学习Linux的休眠和唤醒
使用qemu来学习Linux的休眠和唤醒
|
5月前
|
Linux 编译器 开发工具
Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
|
IDE Linux 编译器
【Linux】gcc/g++编译器、make/Makefile自动化构建工具
目录 1.gcc/c++的概念: 2.程序编译过程详解: 2.1程序编译过程:
80 0
|
5月前
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
|
4月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
47 0
|
5月前
|
NoSQL Linux 开发工具
【Linux】5. 开发工具的使用(gcc/gdb/makefile)
【Linux】5. 开发工具的使用(gcc/gdb/makefile)
56 2
|
NoSQL IDE Unix
Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具(2)
Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具(2)
168 0