Linux制作C++静态库和动态库并使用示例

创建动态库:

编写源文件:
// sub.h 显式调用
#include <iostream>extern "C" int sub(int a, int b);// sub.cpp
#include "sub.h"int sub(int a, int b)
{return a - b;
}// quadrature.h 隐式调用
#include <iostream>int quadrature(const int& a, const int& b);// quadrature.cpp
#include "quadrature.h"int quadrature(const int& a, const int& b)
{return a - b;
}
编译源文件为位置无关的目标文件:

对于C++:

g++ -c -fPIC example.cpp -o example.o

-fPIC 参数用于生成位置无关的代码,这是创建动态库所必需的。

创建动态库:

g++ -shared -o libexample.so example.o

这会将目标文件 example.o 创建成一个名为 libexample.so 的动态库。

使用动态库:

隐式调用

// main.cpp#include <iostream>
#include <dlfcn.h>
#include <stdlib.h>#include "quadrature.h"int main()
{std::cout << quadrature(1, 2) << std::endl;return 0;
}
编译源文件并链接动态库:

对于C++:

g++ main.cpp -o main -L./ -lquadrature

其中,-L 用于指定库文件的路径,-l 用于指定要链接的库(注意不需要写lib前缀和.so后缀)。

配置

第一种:隐式调用动态库需要把动态库拷贝到系统默认的库路径中,所以可以手动拷贝
第二种:

设置 LD_LIBRARY_PATH:** 如果库文件不在系统标准的库路径下,你可以使用 LD_LIBRARY_PATH 环境变量将其所在目录添加
到库搜索路径中。例如:export LD_LIBRARY_PATH=/usr/vscode/动态库和静态库/隐式调用动态库/libquadrature.so:$LD_LIBRARY_PATH但是这样有一个弊端,就是重新打开一个终端,就得再配置一遍环境变量

运行程序:

./main

这样就完成了在Linux下创建和使用动态库的过程。确保在编译时包含了正确的头文件路径和库文件路径,并且链接了所需的动态库。需要注意的是,在运行时,系统需要能够找到动态库,可以通过将动态库路径加入到LD_LIBRARY_PATH环境变量中,或者将动态库拷贝到系统默认的库路径中。

显式调用

在这里插入图片描述

// main.cpp#include <iostream>
#include <dlfcn.h>
#include <stdlib.h>#include "sub.h"typedef int (*dfunc)(int, int);int main()
{void* dlib = dlopen("./libsub.so", RTLD_LAZY);if (!dlib){std::cout << "动态库打开失败" << std::endl;return -1;}dfunc sub = (dfunc)dlsym(dlib, "sub");if (!sub){std::cout << "动态库加载失败" << std::endl;dlclose(dlib);return -1;}std::cout << sub(1, 2) << std::endl;dlclose(dlib);return 0;
}
编译源文件并链接动态库:

对于C++:

g++ main.cpp -o main -ldl

显式调用动态库不需要链接动态库路径和名称,但是因为调用了dlopen、dlsym、dlclose函数,需要链接libdl.so库

配置

不需要配置

运行程序:
./main

在Linux系统下创建静态库(Static Library)并使用,你可以按照以下步骤进行:

创建静态库:

编写源文件: 创建你的C/C++源文件(例如,example.c或example.cpp),并编写相应的代码。
/

/ sum.h
#include <iostream>int sum(const int& a, const int& b);// sum.cpp
#include "sum.h"int sum(const int& a, const int& b)
{return a + b;
}
编译源文件: 使用编译器将源文件编译成目标文件(.o文件):

对于C++:

g++ -c sum.cpp -o sum.o
打包目标文件为静态库:
ar rcs libexample.a sum.o

这会将目标文件 example.o 打包成一个名为 libexample.a 的静态库。

使用静态库:

在这里插入图片描述

编写使用静态库的源文件: 创建另一个源文件,并编写使用静态库的代码。
// main.cpp
#include <iostream>#include "sum.h"int main()
{std::cout << sum(1, 2) << std::endl;return 0;
}
编译源文件并链接静态库:

对于C++:

g++ main.cpp -o main -L./ -lsum

其中,-L 用于指定库文件的路径,-l 用于指定要链接的库(注意不需要写lib前缀和.a后缀)。

运行程序:
./main

这样就完成了在Linux下创建和使用静态库的过程。确保在编译时包含了正确的头文件路径和库文件路径,并且链接了所需的静态库。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频分块上传Vue3+SpringBoot3+Minio

文章目录 一、简化演示分块上传、合并分块断点续传秒传 二、更详细的逻辑和细节问题可能存在的隐患 三、代码示例前端代码后端代码 一、简化演示 分块上传、合并分块 前端将完整的视频文件分割成多份文件块&#xff0c;依次上传到后端&#xff0c;后端将其保存到文件系统。前…

6、【单例模式】确保了一个类在程序运行期间只有一个实例

你好&#xff0c;我是程序员雪球 在软件设计中&#xff0c;单例模式是一种常见的设计模式。它确保了一个类在程序运行期间只有一个实例&#xff0c;并提供了全局访问该实例的方式。单例模式在许多场景中都有广泛的应用&#xff0c;例如共享资源管理、数据库连接、日志记录器等…

多线程3

线程安全 线程可能会出现这些情况 导致两个线程不能达到自己想要去循环的次数&#xff0c;可能两个线程各10000&#xff0c;那么他们就会出现不到5000甚至不到5000的情况。 出现线程的不安全原因&#xff1a; 1.线程在系统中是随机调度,抢占式执行的.[线程不安全的, 罪魁祸首…

考研回忆录【二本->211】

备考时长差不多快一年半&#xff0c;从22年的11月底开始陆陆续续地准备考研&#xff0c;因为开始的早所以整个备考过程显得压力不是很大&#xff0c;中途还去一些地方旅游&#xff0c;我不喜欢把自己绷得太紧。虽然考的不是很好&#xff0c;考完我甚至都没准备复试&#xff0c;…

【软件工程】详细设计(一)

1. 引言 1.1 编写目的 该文档的目的是描述《学生成绩管理系统》项目的详细设计&#xff0c;其主要内容包括&#xff1a; 系统功能简介 系统详细设计简述 各个模块的实现逻辑 最小模块组件的伪代码 本文档的预期的读者是&#xff1a; 开发人员 项目管理人员 测试人员 …

docker容器技术篇:Docker API配置与常用操作

docker容器技术篇&#xff1a;Docker API配置与使用 一、API具体是什么&#xff1f; 百科解释应用程序接口&#xff08;API&#xff09;&#xff0c;又称为应用编程接口&#xff0c;就是软件系统不同组成部分衔接的约定&#xff0c;蒙了吧&#xff01;&#xff01;&#xff0…

解决沁恒ch592单片机在tmos中使用USB总线时,接入USB Hub无法枚举频繁Reset的问题

开发产品时采用了沁恒ch592&#xff0c;做USB开发时遇到了一个奇葩的无法枚举问题。 典型症状 使用USB线直连电脑时没有问题&#xff0c;可以正常使用。 如果接入某些特定方案的USB Hub&#xff08;例如GL3510、GL3520&#xff09;&#xff0c;可能会出现以下2种情况&#xf…

【NLP练习】中文文本分类-Pytorch实现

中文文本分类-Pytorch实现 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 1. 任务说明 本次使用Pytorch实现中文文本分类。主要代码与文本分类代码基本一致&#xff0c;不同的是本次任务使用…

MyBatis 解决上篇的参数绑定问题以及XML方式交互

前言 上文:MyBatis 初识简单操作-CSDN博客 上篇文章我们谈到的Spring中如何使用注解对Mysql进行交互 但是我们发现我们返回出来的数据明显有问题 我们发现后面三个字段的信息明显没有展示出来 下面我们来谈谈解决方案 解决方案 这里的原因本质上是因为mysql中和对象中的字段属性…

【微服务】------核心组件架构选型

1.微服务简介 微服务架构&#xff08;Microservice Architecture&#xff09;是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦&#xff0c;从而降低系统的耦合性&#xff0c;并提供更加灵活的服务支持。 2.微服务技术选型 区域内容…

【零基础学数据结构】顺序表实现书籍存储

目录 书籍存储的实现规划 ​编辑 前置准备&#xff1a; 书籍结构体&#xff1a; 书籍展示的初始化和文件加载 书籍展示的销毁和文件保存 书籍展示的容量检查 书籍展示的尾插实现 书籍展示的书籍增加 书籍展示的书籍打印 书籍删除展示数据 书籍展示修改数据 在指定位置之前…

2024年第八届人工智能与虚拟现实国际会议(AIVR 2024)即将召开!

2024年第八届人工智能与虚拟现实国际会议&#xff08;AIVR 2024&#xff09;将2024年7月19-21日在日本福冈举行。人工智能与虚拟现实的发展对推动科技进步、促进经济发展、提升人类生活质量等具有重要意义。AIVR 2024将携手各专家学者&#xff0c;共同挖掘智能与虚拟的无限可能…

加速度:电子元器件营销网站的功能和开发周期

据工信部预计&#xff0c;到2023年&#xff0c;我国电子元器件销售总额将达到2.1万亿元。随着资本的涌入&#xff0c;在这个万亿级赛道&#xff0c;市场竞争变得更加激烈的同时&#xff0c;行业数字化发展已是大势所趋。电子元器件B2B商城平台提升数据化驱动能力&#xff0c;扩…

【机器学习】如何通过群体智慧解决机器学习的挑战“

机器学习的发展日新月异&#xff0c;但其成功实施的关键之一仍然是获取高质量的、标注良好的数据集。在这篇文章中&#xff0c;我们将探讨如何通过群体智慧来构建和改善机器学习的数据集&#xff0c;尤其是通过reCAPTCHA和带有目的的游戏&#xff08;Games with a Purpose, GWA…

齐护机器人方位传感器指南针罗盘陀螺仪

一、方位传感器原理及功能说明 齐护方位传感器是一款集成了三轴磁传感器芯片的方位传感器模块。适用于无人机、机器人、移动和个人手持设备中的罗盘&#xff08;指南针&#xff09;、导航和游戏等高精度应用。模块可以感应XYZ平面角度外&#xff0c;还可实现1至2的水平面角度罗…

Python | Leetcode Python题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; class Solution:def isMatch(self, s: str, p: str) -> bool:m, n len(s), len(p)dp [False] * (n1)# 初始化dp[0] Truefor j in range(1, n1):if p[j-1] *:dp[j] dp[j-2]# 状态更新for i in range(1, m1):dp2 [False] * (n1) …

Transformer位置编码详解

在处理自然语言时候&#xff0c;因Transformer是基于注意力机制&#xff0c;不像RNN有词位置顺序信息&#xff0c;故需要加入词的位置信息来显示的表明词的上下文关系。具体是将词经过位置编码(positional encoding)&#xff0c;然后与emb词向量求和&#xff0c;作为编码块(Enc…

备考2024年思维100春季线上比赛?来做做官方模拟题(附答案)

2024年春季思维100活动第一阶段线上比赛&#xff08;4月20日&#xff0c;星期六&#xff0c;上午&#xff09;的报名正在进行中&#xff0c;更多安排和需要提前了解的关键点可以见我前面写的文章&#xff0c;或者直接联系我获取相关资料。 【提醒】2024年春季的思维100在线比赛…

递归算法解读

递归&#xff08;Recursion&#xff09;是计算机科学中的一个重要概念&#xff0c;它指的是一个函数&#xff08;或过程&#xff09;在其定义中直接或间接地调用自身。递归函数通过把问题分解为更小的相似子问题来解决原问题&#xff0c;这些更小的子问题也使用相同的解决方案&…

ClickHouse笔记

1. 简介 开发背景: ClickHouse 由 Yandex 于 2016 年开源&#xff0c;目的是提供高性能的 OLAP 解决方案。性能: ClickHouse 能够以极高的速度处理大量数据&#xff0c;每秒可以处理数亿到十亿多行数据。架构: 它使用 C 编写&#xff0c;提供丰富的数据类型、数据库引擎和表引…