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

news2024/11/17 10:29:13

创建动态库:

编写源文件:
// 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.coloradmin.cn/o/1571384.html

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

相关文章

云服务器centos提示 Cannot prepare internal mirrorlist: No URLs in mirrorlist的解决办法

yum update -y CentOS-8 - AppStream 118 B/s | 38 B 00:00 Error: Failed to download metadata for repo AppStream: Cannot prepare internal mirrorlist: No URLs in mirrorlist 执行下面的命令就可…

LeetCode题练习与总结:合并区间--56

一、题目描述 示例 1&#xff1a; 输入&#xff1a;intervals [[1,3],[2,6],[8,10],[15,18]] 输出&#xff1a;[[1,6],[8,10],[15,18]] 解释&#xff1a;区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2&#xff1a; 输入&#xff1a;intervals [[1,4],[4,5]] 输出&a…

springCloudAlibaba集成gateWay实战(详解)

一、初识网关&#xff1f; 1、网关介绍 ​ 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话…

我与C++的爱恋:类与对象(一)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&…

【每日力扣】198.打家劫舍与213.打家劫舍II与337.打家劫舍 III

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 198.打家劫舍 力扣题目链接(opens new window) 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&…

谷歌AI搜索革新:探索高级搜索服务背后的未来趋势

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Redis -- 缓存穿透问题解决思路

缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&#xff1a; 额外…

STM32之HAL开发——不同系列SPI功能对比(附STM32Cube配置)

不同系列STM32——SPI框图 F1系列框图 F4系列框图 TI模式时序图特性 F7系列框图 H7系列框图 注意&#xff1a;F7系列以及H7系列支持Quad-SPI模式&#xff0c;可以连接单&#xff0c;双或者四条数据线的Flash存储介质。 SPI——Cube配置流程 RCC时钟源配置 SYS系统调试模式配…

【SCI绘图】【箱型图系列1 python】多类对比及各类下属子类对比

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【箱型图系列1】多类对比各类下属子类对比 文末附带完整代码&#xff1a; 1.环境准备 python 3 from matplotlib import p…

Go语言hash/fnv应用实战:技巧、示例与最佳实践

Go语言hash/fnv应用实战&#xff1a;技巧、示例与最佳实践 引言hash/fnv概览使用hash/fnv的初步步骤导入hash/fnv库创建哈希器实例 hash/fnv在实际开发中的应用生成唯一标识符数据分片与负载均衡快速查找 高级技巧和最佳实践避免哈希碰撞动态调整哈希表大小利用sync.Pool优化哈…

【蓝桥杯】GCD与LCM

一.概述 最大公约数&#xff08;GCD&#xff09;和最小公倍数&#xff08;Least Common Multiple&#xff0c;LCM&#xff09; 在C中&#xff0c;可以使用 std::__gcd(a, b)来计算最大公约数 1.欧几里德算法/辗转相除法 int gcd(int a,int b){return b?gcd(b, a%b):a; } 2…

HTML5动画设计工具 Hype 4 Pro v4.1.14中文激活版

Hype Pro是一款功能丰富、易用且灵活的HTML5动画设计工具&#xff0c;适用于设计师、开发者和创作者创建各种精美的交互式网页动画。它的强大功能和可视化编辑界面使用户能够快速而轻松地实现复杂的动画效果&#xff0c;同时支持多种输出格式和交互方式&#xff0c;满足用户对网…

内网安全之-kerberos协议

kerberos协议是由麻省理工学院提出的一种网络身份验证协议&#xff0c;提供了一种在开放的非安全网络中认证识别用户身份信息的方法。它旨在通过使用秘钥加密技术为客户端/服务端应用提供强身份验证&#xff0c;使用kerberos这个名字是因为需要三方的共同参与才能完成一次认证流…

中科驭数DPU技术开放日秀“肌肉”:云原生网络、RDMA、安全加速、低延时网络等方案组团亮相

2024年3月29日&#xff0c;中科驭数以“DPU构建高性能云算力底座”为主题的线上技术开放日活动成功举办。在开放日上&#xff0c;中科驭数集中展现了其在低时延网络、云原生网络及智算中心网络三大关键场景下的技术成果与五大核心DPU解决方案&#xff0c;凸显了中科驭数在高性能…

RDD算子(四)、血缘关系、持久化

1. foreach 分布式遍历每一个元素&#xff0c;调用指定函数 val rdd sc.makeRDD(List(1, 2, 3, 4)) rdd.foreach(println) 结果是随机的&#xff0c;因为foreach是在每一个Executor端并发执行&#xff0c;所以顺序是不确定的。如果采集collect之后再调用foreach打印&#xf…

使用CSS计数器,在目录名称前加上了序号,让目录看起来更加井然有序

目录&#xff08;Text of Contents缩写为TOC&#xff09;&#xff0c;其实就是一篇文章的概要或简述。这好比&#xff0c;去书店买书&#xff0c;先是被这本书的标题所吸引&#xff0c;而后我们才会&#xff0c;翻开这本书目录&#xff0c;看看这本书主要是在讲些什么&#xff…

Claude 3 on Amazon Bedrock 结合多智能体助力 Altrubook AI 定义消费者 AI 新范式

关于 Altrubook AI 智能消费决策机器人 Altrubook 是全球首创场景化智能决策机器人&#xff0c;由国内外大厂等前员工共同研发&#xff0c;具有定制化 IP 决策机器人、沉浸式购物体验和需求匹配优化等独特优势。目前&#xff0c;Altrubook AI 已完成与 Claude 3 on Amazon Bedr…

【深度优先】【树上倍增 】2846. 边权重均等查询

本文涉及知识点 深度优先 树上倍增 LeetCode2846. 边权重均等查询 现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi, wi] 表示树中存在一条位于节点 ui…

备战蓝桥杯---贡献法刷题

话不多说&#xff0c;直接看题&#xff1a; 什么是贡献法&#xff1f;这是一种数学思想&#xff0c;就是看每一个元素对总和的贡献。 1. 我们可以先枚举区间再统计次数&#xff0c;但这显然TLE。我们可以发现&#xff0c;每一个孤独的区间对应一个孤独的牛&#xff0c;因此我…

注意力机制篇 | YOLOv8改进之添加多尺度全局注意力机制DilateFormer(MSDA)| 即插即用

前言:Hello大家好,我是小哥谈。多尺度全局注意力机制DilateFormer是一种用图像识别任务的深度学习模型。它是在Transformer模型的基础上进行改进的,旨在提高模型对图像中不同尺度信息的感知能力。DilateFormer引入了多尺度卷积和全局注意力机制来实现多尺度感知。具体来说,…