生成与调用C++动态链接库(so文件)

news/2024/6/1 22:47:05 标签: c++, 开发语言, linux, 动态链接库

文章目录

  • 前言
  • 生成C++动态链接库
    • 步骤1:编写C++源码
    • 步骤2:生成共享库
    • 步骤3:验证生成的SO文件
  • 调用C++动态链接库
    • 步骤1:修改原来makefile
    • 步骤2:编译调用程序
    • 步骤3:运行调用程序
  • 总结


前言

动态链接库是代码重用和模块化的重要工具,它使得将功能封装为独立的库更加容易,同时还可以动态加载和升级这些库,提高了程序的灵活性和可维护性。
当我们希望将C++源码编译成动态链接库,并在其他应用程序中调用这个动态链接库,是这篇文章的应用场景。这篇文档将介绍如何创建、编译、链接和调用C++动态链接库
PS:本文以下内容根据我实际工作项目编写,不采用demo的形式。


生成C++动态链接库

步骤1:编写C++源码

首先,编写C++源码文件,包括所需的类和函数。(看这篇文章的应该都有源码了吧!)
我实际的项目文件如下:
在这里插入图片描述
现在需要把ai_main.cpp编译成动态链接库。难点在于(完成后看来也不是什么难点):ai_main.cpp不仅调用了同级目录下的其他文件,还调用了其他路径的下源码文件(opencv等)

步骤2:生成共享库

使用C++编译器将源码编译成共享库,我这里采用的是aarch64-mix210-linux-g++编译工具链:

  1. 在同级目录下创建一个名为"build"的文件夹,该文件夹将用于构建目标文件和.so文件。打开命令行终端并进入到该目录下。
mkdir build && cd build
  1. 运行以下命令,将所有依赖的cpp文件编译为目标文件(.o文件):
aarch64-mix210-linux-g++ -c -fPIC -I/home/data/ai/opencv/include -I/home/data/ai/Ascend/ascend-toolkit/5.10.t20.0.b200/arm64-lmixlinux200/aarch64-linux/include ../*.cpp

-c选项告诉编译器只进行编译而不进行链接操作。
-fPIC选项表示生成位置无关代码,这是生成共享库所必需的。
-I选项指定头文件目录,如果有其他cpp文件中使用了头文件,则需要将其添加到该选项中。

  1. 运行以下命令将目标文件链接为共享库文件.so
aarch64-mix210-linux-g++ -shared -o libmy_main.so *.o

-shared选项表示生成共享库文件。
-o选项指定输出文件名。
完成后,你将在"build"文件夹中找到生成的libmy_main.so文件,这是可以给别人用来动态链接的共享库。
在这里插入图片描述

在上述命令中可以换成自己的编译工具(例如g++),需要根据实际情况修改文件名和路径。另外,如果代码中有其他库的依赖,你需要确保这些库已经安装并在编译/链接时正确配置了相关选项。

步骤3:验证生成的SO文件

通过运行以下命令来验证生成的SO文件是否可用:

file libmy_main.so

这应该显示类似于以下内容:

libmy_main.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, not stripped

so文件生成成功。

检查符号链接:
运行以下命令,并确保输出中包含后续所需调用函数的定义。

nm libmy_main.so | grep ai_track

输出类似于:

0000000000061218 T ai_track

出现以上结果,说明ai_track函数在生成的共享库libmy_main.so中是可见的。这意味着该函数的定义在共享库中是存在的。ai_track需要替换成自己对外的接口函数,也就是其他程序调用so的函数。

调用C++动态链接库

现在,我们将展示如何在另一个C++程序中调用生成的C++动态链接库。我这是是做的测试,把原来源码编译部分替换成调用生成的so

步骤1:修改原来makefile

# 注释掉原来调用原代码部分
# SMP_SRCSCPP += $(wildcard $(PWD)/../media/ai/src/*.cpp)
# 添加共享库的头文件和库路径
COMM_INC += -I/home/ai/src/build/include
CFLAGS += -L/home/src/build/lib

# 添加共享库的链接标志,例如 libmy_main.so
CFLAGS += -lmy_main

# 如果共享库是C++库,添加C++编译器标志
CFLAGS += -lstdc++

其中:
COMM_INC += -I/home/ai/src/build/include:目录下为so提供的函数接口的头文件,可以直接复用源码中对应的ai_main.h
CFLAGS += -L/home/src/build/lib:确保 -L 选项中指定的共享库路径是正确的,并且包含了包含所需共享库libmy_main.so的目录;
CFLAGS += -lmy_main:通常,共享库名称应该是去掉 lib 前缀和 .so 后缀的部分。在这种情况下,libmy_main.so应该是 -lmy_main

步骤2:编译调用程序

我这里直接在原来的基础上重新编译:

make clean && make -j4

运行完成后会生成可执行文件,我这里可执行文件暂为run_main

步骤3:运行调用程序

运行run_main文件时,需要指定so动态链接库的路径

export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH

或者,可以在使用运行时链接:

run_main -rpath /path/to/your/library

这将在运行时为应用程序指定共享库的搜索路径。

无论您选择哪种方法,都确保共享库的路径设置正确,以便您的应用程序可以正确找到和加载所需的共享库。


总结

本文介绍了如何制作C++动态链接库so文件)以及如何从另一个C++程序中加载和调用该库。本文主要从笔者自身项目出发,其中的过程不一定适用所有人。
如果阅读本文对你有用,欢迎一键三连呀!!!
2023年9月5日14:25:02
在这里插入图片描述


http://www.niftyadmin.cn/n/5004523.html

相关文章

【LeetCode算法系列题解】第56~60题

CONTENTS LeetCode 56. 合并区间(中等)LeetCode 57. 插入区间(中等)LeetCode 58. 最后一个单词的长度(简单)LeetCode 59. 螺旋矩阵 II(中等)LeetCode 60. 第k个排列(困难…

富士康曲线救国,iPhone 15 Pro订单较上代有减少,iPhone 15增加

据外媒报道,苹果将于9月13日凌晨举行的秋季新品发布会上推出iPhone 15系列智能手机。然而,令人惊讶的是,这款备受期待的手机在8月份就已开始批量生产,以确保上市初期供应充足。 随着iPhone 15系列发布时间的临近,越来越…

高忆管理:证券账户国债逆回购怎么操作?

国债逆回购的本质就是一种短期贷款,个人经过国债回购商场把自己的资金借出去,取得固定的利息收益,那么,证券账户国债逆回购怎样操作?怎样在股票账户上买国债逆回购?下面高忆管理为我们准备了相关内容&#…

常见的八种排序算法

目录 1 排序1.1 插入排序1.1.1 直接插入排序基本思想方法(步骤)核心代码直接插入排序特性总结 1.1.2 希尔排序(缩小增量排序)基本思想方法(步骤)核心代码希尔排序特性总结 1.2 选择排序1.2.1 直接选择排序方…

手把手教你调用电商API获取淘宝订单数据(内附详细源码)

接口名称:seller_order_list-获取卖出的商品订单列表 taobao.seller_order_list 公共参数 请求地址:https://api-sever.cn/taobao/seller_order_list 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥…

GPT引领前沿与应用突破之GPT-4科研实践技术与AI绘图

查看原文>>>GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图 目录 专题一、AIGC概述 专题二、人工智能算法介绍 专题三、大语言模型Prompt提示词使用技巧 专题四、让GPT成为你的生活助理(动手练习) 专题五、让GPT成为你的工作秘书&…

Vue + Element UI 前端篇(十五):嵌套外部网页

Vue Element UI 实现权限管理系统 前端篇(十五):嵌套外部网页 嵌套外部网页 在有些时候,我们需要在我们的内容栏主区域显示外部网页。如查看服务端提供的SQL监控页面,接口文档页面等。 这个时候就要求我们的导航菜…

【网络爬虫笔记】爬虫Robots协议语法详解

Robots协议是指一个被称为Robots Exclusion Protocol的协议。该协议的主要功能是向网络蜘蛛、机器人等搜索引擎爬虫提供一个标准的访问控制机制,告诉它们哪些页面可以被抓取,哪些页面不可以被抓取。本文将进行爬虫Robots协议语法详解,同时提供…