【C++】C++创建动态链接库并调用

news2024/9/23 13:16:48

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. c++库介绍
    • :blush:2. c++创建动态链接库
    • :satisfied:3. c++调用动态链接库

😏1. c++库介绍

C++动态库是一种常用的库文件形式。它允许多个应用程序共享代码和数据,提供了一种有效地组织、重用和管理代码的方式。

与静态库不同,动态库在运行时被加载到内存中,并通过链接器动态地连接到应用程序。这意味着多个应用程序可以同时使用同一个动态库,从而减少了内存占用和可执行文件的大小。

C++动态库具有以下优势:

1.代码共享:多个应用程序可以共享同一个动态库中的代码和函数。这使得开发者可以将通用的功能封装到一个库中,以便在多个项目中重复使用,从而提高代码的复用性和维护性。

2.动态加载:动态库在运行时动态加载到内存中,而不是在编译时静态链接到应用程序。这使得应用程序能够根据需要加载不同版本或替代实现的库,从而实现更灵活的软件设计和更新。

3.更新和修复:由于动态库是独立于应用程序的,所以可以单独更新和修复库文件,而无需重新编译整个应用程序。这样可以加快更新和发布新功能的速度,同时减少对已部署应用程序的影响。

4.内存效率:由于多个应用程序可以共享同一个动态库的实例,因此可以减少内存占用。这在需要同时加载多个应用程序时尤为重要。

😊2. c++创建动态链接库

创建create_so文件夹,结构如下:

.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── cmake_install.cmake
│   ├── lib
│   └── lib_hello
└── lib_hello
    ├── CMakeLists.txt
    ├── hello.cpp
    └── hello.h

CMakeLists.txt如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(Create_so)
# 若变量BUILD_SHARED_LIBS没有设置,并且在ADD_LIBRARY时没有指定库类型
# 默认生成的都是静态库
#SET(BUILD_SHARED_LIBS on)
ADD_SUBDIRECTORY(lib_hello)

创建lib_hello目录,CMakeLists.txt如下:

AUX_SOURCE_DIRECTORY(. SRC_LIST)
ADD_LIBRARY(hello_shared SHARED ${SRC_LIST}) # lib的名字不能重复
ADD_LIBRARY(hello_static STATIC ${SRC_LIST})
# 希望 "hello_static" 在输出时,不是"hello_static",而是以"hello"的名字显示,故设置如下:
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello_shared PROPERTIES OUTPUT_NAME "hello")
# 设置动态库的版本号
SET_TARGET_PROPERTIES(hello_shared PROPERTIES VERSION 1.2 SOVERSION 1)
# 指定保存路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

hello.h如下:

#ifndef HELLO_H
#define HELLO_H
void Hello(void);
int Sum(int a, int b);
#endif

hello.cpp如下:

#include <iostream>
#include "hello.h"
using namespace std;
void Hello(void)
{
    cout << "hello world" << endl;
}

int Sum(int a, int b)
{
    int c;
    c = a + b;
    return c; 
}

编译:

mkdir build && cd build
cmake ..
# 生成so文件在build/lib下的libhello.so

😆3. c++调用动态链接库

创建use_so目录,结构如下:

.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── bin
│   ├── cmake_install.cmake
│   └── src
└── src
    ├── CMakeLists.txt
    └── main.cpp

CMakeLists.txt如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(Use_so)
ADD_SUBDIRECTORY(src)

创建src,CMakeLists.txt如下:

AUX_SOURCE_DIRECTORY(. SRC_LIST)
LINK_DIRECTORIES(/home/dev/test/create_so/build/lib) # 这行一定要在ADD_EXECUTABLE前面
ADD_EXECUTABLE(use_so ${SRC_LIST})
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

SET(CMAKE_PROJECT_DIR /home/dev/test) # 文件夹的位置
INCLUDE_DIRECTORIES(${CMAKE_PROJECT_DIR}/create_so/lib_hello)
TARGET_LINK_LIBRARIES(use_so hello) # 链接动态库
#TARGET_LINK_LIBRARIES(use_so libhello.a) # 链接静态库

main.cpp如下:

#include <hello.h>
#include <iostream>
int main(int argc, char **argv)
{
    std::cout << "Example: use c++ .so lib" << std::endl;
    Hello();
    int c = Sum(1, 2);
    std::cout << "c: " << c << std::endl;
    std::cout << "End!" << std::endl;
    return 0;
}

调用后结果如下:

Example: use c++ .so lib
hello world
c: 3
End!

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车载蓝牙通信开发之各种协议原理解析

车载蓝牙开发需要考虑到蓝牙协议栈集成、连接管理、电话功能集成、媒体播放控制、数据交换和服务发现、安全性和隐私保护等方面。这对于实现车辆与蓝牙设备之间的无线通信和交互功能非常关键。 使车辆能够与蓝牙设备进行通信和交互的开发过程。 蓝牙协议栈集成&#xff1a; …

SpringCloud与SpringBoot版本对应关系

浏览器访问start.spring.io/actuator/info 出现JSON字符串&#xff0c;再访问json.cn&#xff0c;在里面解析该字符串 如果对应不上&#xff0c;可能会出现很多环境上的坑

KKRT16 PSI算法

概念介绍 KKRT16 算法是一种基于OT的轻量级隐私求交协议&#xff0c;用于在半诚实敌手存在的情况下对伪随机函数&#xff08;OPRF&#xff09;进行不经意的评估。 在 OPRF 协议中&#xff0c;接收器有一个输入 r r r&#xff1b; 发送方获得输出 s s s&#xff0c;接收方获得…

【Hello mysql】 mysql的基本查询

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的基本查询 mysql的基本查询 create单行插入全列插入多行查询指定列查询插入否则更新 &#xff08;不常用&#xff09;替换 Retrieveselect列全列查询指定列查询查询字段为表达式结果去重 where条件找到英语小于6…

Unity 分块延迟渲染01 (TBDR)

现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU。 CPU被用于处理需要低内存延迟的序列、大量分支的数据集&#xff0c;其晶体管用于流控制和数据缓存。 GPU为处理大型&#xff0c;未分支的数据集&#xff0c;如3D渲染。晶体管专用于寄存器和算术逻辑单元&…

Django_内置的用户认证系统

目录 一、用户对象 1. 创建用户 2. 修改密码 3. 用户验证 二、权限与授权 1. 默认权限 2. 用户组 3. 在代码中创建权限 4. 权限缓存 三、在视图中认证用户 1、登录用户 2、注销用户 3、用户登录的访问限制 3.1、原始的办法 3.2、函数视图使用login_required装饰…

【前端】网页开发精讲与实战 CSS Day 1

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;前端 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你有…

Go 并发模型—Goroutine

前言 Goroutines 是 Go[1] 语言主要的并发原语。它看起来非常像线程&#xff0c;但是相比于线程它的创建和管理成本很低。Go 在运行时将 goroutine 有效地调度到真实的线程上&#xff0c;以避免浪费资源&#xff0c;因此您可以轻松地创建大量的 goroutine&#xff08;例如每个请…

快速排序—C语言实现

目录 前言 快速排序 实现逻辑 1. hoare版本​编辑 2. 挖坑法 3. 前后指针版本 快速排序优化 1. 三数取中法选key 2. 递归到小的子区间时&#xff0c;可以考虑使用插入排序 快速排序非递归&#xff08;用栈实现&#xff09; 快速排序的特性总结 全部代码 前言 &#…

idea-spring boot开发

安装maven与配置配置maven安装插件 已经装好了idea与jdk 安装maven与配置 下载地址: https://maven.apache.org/download.cgi 下载合适的版本 配置maven 打开设置: 直接搜索 :maven 配置变量: 此电脑->属性->高级系统设置->环境变量 新建系统变量 MAVEN_HOME&#xff…

Web安全——渗透测试基础知识下

渗透测试基础 Web安全一、VMware虚拟机学习使用1、虚拟机简单介绍2、网络模式2.1 桥接网络&#xff08;Bridged Networking&#xff09;2.2 NAT模式2.3 Host-Only模式 3、通俗理解 二、Kali的2021安装与配置1、简单介绍2、Kali的版本3、配置3.1 安装虚拟机open-vm-tools-deskto…

基于matlab从ROI和蒙版在图像中创建标记(附源码)

一、前言 此示例演示如何从一组 ROI 创建标记的阻止映像。 在此示例中&#xff0c;您使用两种方法来获取和显示标记的数据。一种方法使用多边形ROI对象来存储肿瘤和正常组织区域边界的坐标。该函数将ROI坐标转换为标记的块图像。第二种方法使用掩码来指示图像的二进制分割为组…

能不能推荐个 vue 后台管理系统模板?

前言 下面是我整理的vue2和vue3的一些后台管理系统模板&#xff0c;希望对你有帮助~ Vue2 1、iview-admin Star: 16.4k 基于 iview组件库开发的一款后台管理系统框架&#xff0c;提供了一系列的强大组件和基础模板&#xff0c;方便开发人员快速搭建一套功能丰富、界面美观、…

web入门案例-部门篇

开发流程 完成对应部门管理和员工管理的需求 准备工作 注意&#xff1a;service还要写接口实体类&#xff0c;mapper只写接口即可&#xff0c;controller是实体类 对应的三个注解 RestController&#xff08;方法返回值作为响应值&#xff09; Mapper(控制反转IOC&#xff0c…

漏洞深度分析 | CVE-2023-36053-Django 表达式拒绝服务

​ 项目介绍 Django 是一个高级 Python Web 框架&#xff0c;鼓励快速开发和简洁、务实的设计。它由经验丰富的开发人员构建&#xff0c;解决了 Web 开发的大部分麻烦&#xff0c;因此您可以专注于编写应用程序&#xff0c;而无需重新发明轮子。它是免费且开源的。 项目地址…

CodeTop整理-树篇

目录 103. 二叉树的锯齿形层次遍历 236. 二叉树的最近公共祖先 124. 二叉树中的最大路径和 102. 二叉树的层序遍历 94. 二叉树的中序遍历 110. 平衡二叉树 572. 另一个树的子树 96. 不同的二叉搜索树 543. 二叉树的直径 297. 二叉树的序列化与反序列化 199. 二叉树的…

eNSP-VRRP虚拟路由器冗余技术

VRRP-虚拟路由器冗余技术 文章目录 VRRP-虚拟路由器冗余技术一、拓扑结构二、基本配置三、测试验证四、知识点详解1.VRRP路由器2.报文格式3.工作过程 一、拓扑结构 二、基本配置 R1: #配置ip <Huawei>sys [Huawei]sys r1 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip a…

快速排序算法!

快速排序 什么是快速排序&#xff08;quickSort&#xff09;&#xff1f; 主要分成两部分实现&#xff0c;分区、递归操作。 分区 从数组中任意选择一个 “基准”&#xff0c;所有比基准小的元素放在基准前面&#xff0c;比基准大的元素放在基本后面。 递归 递归地对基准…

Todo-List案例版本四

全局事件总线 使用步骤 1.定义全局事件总线 new Vue({...beforeCreated(){Vue.prototype.$busthis //安装全局事件总线&#xff0c;$bus就是当前应用的vm}... }) 2.使用事件总线 a.接收数据&#xff1a;A组件想接收数据&#xff0c;则在A组件中给$bus绑定自定义事件&…

Outlook---撤回(或替换)已发出的邮件

0 Preface/Foreword 发送邮件时&#xff0c;发现邮件发错了&#xff0c;或者忘了添加附件&#xff0c;那么就需要用到撤回或者替换功能。 1 撤回/替换邮件方法 步骤如下&#xff1a; 第一步&#xff1a;双击打开邮件&#xff1b; 第二步&#xff1a;找到撤回按键