给已有的.so库重新封装一个新的库,并能使用新旧库中的函数

2024-09-04 22:52

本文主要是介绍给已有的.so库重新封装一个新的库,并能使用新旧库中的函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要求如题,这里给出一个简单的例子,自己亲测可用之后才记录下来。

假设有一个名为 libold.so 的现有库,它包含函数 old_function(),而我们需要在它的基础上重新封装一个新的库 libnew.so。此外,这个库除了提供旧库中的函数 old_function() 外,还提供一个新库中的函数 new_function()

步骤 1:编写封装代码,即新库的生成代码
先创建一个名为 NewDemo.cpp 的文件为例,内容如下,

#include "old_lib.h"  // 假设这是 libold.so 的头文件// 封装旧函数
void old_function_wrapper() {old_function();
}// 新函数
void new_function() {// 实现新函数的逻辑
}

步骤 2:编译封装代码

$ gcc -c -fPIC wrapper.c -o wrapper.o

这里如果包含了多个库的头文件,以及想了解参数含义的,可看看这篇
这里给个例子,gcc / g++主要看你的文件类型:

$ gcc -I ../3rdparty/toolkit/ -I ../3rdparty/dart-sdk/include/ -c A.cpp -fPIC -o A.o

步骤 3:链接到现有库并创建新的动态库

$ gcc -shared -o libnew.so wrapper.o -L/path/to/old_lib -lold

这一步很关键,至少我的问题主要出在这步,也是我太菜,好久才捋顺思路,到最后没出问题。

  • -fPIC:生成位置无关代码,主要用在动态库中。
  • -L/path/to/old_lib:指定包含 libold.so 的目录,这个路径可以是相对路径也可以是绝对路径,到对应存放旧库的文件夹就可。
  • -lold:链接到 libold.so,这里的old是不包括库文件的不包括前缀(libxxx.so)和后缀(libxxx.so)的名字。

此时,libnew.so 就是一个新的动态库,我们可以直接使用 libnew.so 来访问新旧库中的函数,而无需直接与 libold.so 交互。
步骤 4:设置环境变量,确保新项目能找到旧的动态库
在指定项目的路径下,打开终端,设置环境变量:

$ export LD_LIBRARY_PATH=/path/to/old_lib:$LD_LIBRARY_PATH

此时,对通过命令对新的项目(这里假设是最简单的只包含新库的demo)进行编译生成可执行程序,命令如下:

$ g++ test.cpp -o test -lnew -L/new/so/path

这篇关于给已有的.so库重新封装一个新的库,并能使用新旧库中的函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137265

相关文章

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm