【ROS】动态链接库(.so文件)的生成和调用

2023-05-16

【ROS】动态链接库(.so文件)的生成和使用

  • 引言
  • 1.生成so文件
  • 2.调用so文件
  • 3.运行结果
  • 结语

引言

由于项目有涉及到源代码是否交付的选项,想着如果不交付源代码,那就得把程序封装好,但想着还是应该留一点开发空间给别人,所以就想着能不能把方法都变成动态链接库,只对其开放功能使用,不开放源代码编辑。

想着目前网上还没有详细介绍这一部分的内容,在之前自己摸索的经验传授给大家。

包的源代码链接可以点击这里。

1.生成so文件

在同一个文件夹下创建hello类文件,分别是hello.h和hello.cpp

hello.h

//
// Created by dt on 2021/5/13.
//

#ifndef DYNAMIC_CONNECT_HELLO_H
#define DYNAMIC_CONNECT_HELLO_H

class fun{
public:
    int a;
    int b;
    //fun(int aa,int bb):a(aa),b(bb){};
    fun(int aa,int bb);
    ~fun();
    int add_a_b();
};

#endif //DYNAMIC_CONNECT_HELLO_H

hello.cpp

//
// Created by dt on 2021/5/13.
//

#include "hello.h"

int fun::add_a_b() {
    return this->a + this->b;
}

fun::fun(int aa, int bb) {
    this->a = aa;
    this->b = bb;
}

fun::~fun() {

}

在该文件夹下,终端运行

g++ hello.cpp -fPIC -shared -o libhello.so

即可在该文件下获得libhello.so文件

-fPIC:作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载其加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的

-shared:产生一个共享对象,然后可以将其与其他对象链接以形成可执行文件。 并非所有系统都支持此选项。 为了获得可预测的结果,在指定此链接器选项时,还必须指定用于编译的相同选项集(-fpic,-fPIC或模型子选项)

-g:令gcc生成调试信息,该选项可以利用操作系统的“原生格式(native format)”生成调试信息。GDB可以直接利用这个信息,其他调试器也可以使用这个调试信息

-c:仅执行编译操作,不进行连接操作

-o:指定生成的输出文件名称

2.调用so文件

在ros的工作空间,创建一个test的包,hello.h放在include/test目录下,libhello.so放在lib目录下(lib目录需要自行创建)。

test的src下需要创建main.cpp,代码如下

//
// Created by dt on 2021/5/13.
//

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

#include "dynamic_connect/hello.h"


int main(int argc, char **argv)
{
    ros::init(argc,argv,"h_learn");
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<std_msgs::String>("listener",1000);
    ros::Rate loop_rate(10);

    //.so
    fun *f = new fun(4,2);
    int num2 = f->add_a_b();
    delete f;
    f = NULL;

    while(ros::ok())
    {
        std_msgs::String msg;
        std::stringstream ss;

        ss <<"Hello world " << num2;

        msg.data = ss.str();
        ROS_INFO(msg.data.c_str());
        pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
    }

    return 0;
}

CMakeLists.txt如下

cmake_minimum_required(VERSION 3.0.2)
project(dynamic_connect)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rosmsg
  rospy
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES dynamic_connect
#  CATKIN_DEPENDS roscpp rosmsg rospy
#  DEPENDS system_lib
)

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

link_directories(
  lib
  ${catkin_LIB_DIRS}
)

add_executable(main src/main.cpp)
target_link_libraries(main
        ${catkin_LIBRARIES}
        hello
)

具体的修改地方如下

  1. include_directories 需要包含include文件夹;
  2. link_directories 需要添加lib路径,catkin_LIB_DIRS表示创建环境变量,${catkin_LIB_DIRS}为取该环境变量的值,lib是相对于当前软件包所在路径的相对路径;
  3. target_link_libraries :引用动态链接库,这里去掉lib前缀,去掉.so后缀,直接写hello

3.运行结果

代码运行结果如下

[ INFO] [1620976666.758420253]: Hello world 6
[ INFO] [1620976666.858414282]: Hello world 6
[ INFO] [1620976666.958412370]: Hello world 6
[ INFO] [1620976667.058414110]: Hello world 6
[ INFO] [1620976667.158418228]: Hello world 6
[ INFO] [1620976667.258414183]: Hello world 6
[ INFO] [1620976667.358422537]: Hello world 6
[ INFO] [1620976667.458416599]: Hello world 6

结语

其实使用动态链接库还是很简单的,只是以前没有接触过,所以还是对这里面的内容比较陌生,但真正做出来之后,其实发现世上的事情都正如卖油翁一样:“无他,但手熟尔。”

与诸君共勉。

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

【ROS】动态链接库(.so文件)的生成和调用 的相关文章

随机推荐

  • C语言中的输入输出函数

    一 字符数据输入输出函数 1 putchar xff0c 输出一个字符 include lt stdio h gt int main char cChar1 cChar2 cChar3 cChar4 cChar1 61 39 H 39 cC
  • printf的执行顺序&++i与i++的区别

    问题的由来 xff1a 在学习C语言预处理命令时看到这样一段 https www cnblogs com clover toeic p 3851102 html span class token macro property span cl
  • Traceback (most recent call last): File “/home/myp4/.local/bin/pip“, line 5, in <module> from

    https blog csdn net weixin 41135864 article details 89817343 Traceback most recent call last File home myp4 local bin pi
  • sys.stderr.write(f“ERROR: {exc}”)

    https www cjavapy com article 1701
  • 为什么PBFT需要三阶段

    首先 xff0c 第一阶段是预提议 xff08 pre prepare xff09 xff0c 这一阶段的主要原因是使用领导可以降低通信复杂度 xff0c 但是我对其没了解 xff0c 就不瞎说了 接着是提议 xff08 prepare x
  • 文件的自定义包发送接收

    需求 对一个特定的文件进行分片发送 xff0c 构造数据包 xff0c 发送数据包 xff0c 接收数据包并提取有效数据 xff0c 对数据组合还原为原文件 设计 当前 xff0c 基于socket的网络编程已成为当今不可替代的编程方法 x
  • 阿里云服务器图形化界面

    https blog csdn net qq 43264202 article details 119578968
  • 安卓开放端口

    https blog csdn net weixin 39737831 article details 109965587
  • Ubuntu14.04 支持ESM

    https discourse ubuntu com t ubuntu advantage client 21788
  • 开启关闭ICMP

    echo request http www xoxxoo com index index article id 780 html redirect https blog csdn net weixin 39684454 article de
  • AD使用技巧

    AD快捷键 快捷键要处在英文模式的情况下才可以使用 xff1a AD测量快捷键 xff1a R AD对齐快捷键 xff1a A AD切换单位快捷键 xff1a Q AD改变栅格快捷键 xff1a G AD视图配置快捷键 xff1a L AD
  • 多传感器融合框架搭建

    架构 src include apps xff1a 节点文件 front end node cpp 前端节点data pretreat node cpp 数据预处理节点back end node cpp 后端节点loop closing n
  • 多传感器融合框架-ESKF

    架构 基本同图优化框架差不多 内容简述 数据预处理节点 订阅imu原始数据 xff0c gnss原始数据 xff0c 完成数据时间戳同步 点云畸变补偿发布如下消息 畸变补偿后的点云 synced cloudgnss里程计 synced gn
  • OpenCV笔记4.3

    C 43 43 读取目录下所有文件名称 1 包含头文件 96 span class token macro property span class token directive hash span span class token dir
  • 半小时内实现Esp32-Cam模型训练和图像识别

    Esp32 Cam图像识别 一 网页显示视频流1 Linux式例程2 MicroPython式例程步骤1 下载Thonny步骤2 烧录Esp32 Cam固件步骤3 运行相应代码 3 Arduino式例程步骤1 下载Arduino步骤2 安装
  • MANIFOLD 2-G开发 之 利用ROS话题编程实现UART1串口通讯

    目录 MANIFOLD 2 G开发笔记1 项目描述2 遇到的问题3 解决方案4 示例代码5 注意事项6 资源附件6 运行与调试 MANIFOLD 2 G开发笔记 本博客内容将记录MANIFOLD 2 G 开发过程中遇到的问题及解决方案 xf
  • ONOS源码笔记--机制

    app注册 private ApplicationId appId appId 61 coreService registerApplication 34 org onosproject fwd 34 注册应用 xff0c 一般在activ
  • git 本地分支与远程分支关联

    github上已经有master分支 和dev分支 在本地 git checkout b dev 新建并切换到本地dev分支 git pull origin dev 本地分支与远程分支相关联 github上没有dev分支 git check
  • 做设计师还是程序员?一张图你就明白!

    平时大家相安无事 xff0c 可一旦项目滑了水 栽了坑 二重奏就开始没完没了的唱起来了 请看下图 xff1a 你的桌子是有什么 小编反手一摸 xff0c 还好小编的头发还再 你头发呢 xff1f 相信这里有很多学习java的朋友 xff0c
  • 【ROS】动态链接库(.so文件)的生成和调用

    ROS 动态链接库 xff08 so文件 xff09 的生成和使用 引言 xff11 生成so文件 xff12 调用so文件 xff13 运行结果结语 引言 由于项目有涉及到源代码是否交付的选项 xff0c 想着如果不交付源代码 xff0c