day38——动态库与静态库

news2024/11/15 4:13:56

一、linux系统中的库

库在linux系统中是一个二进制文件,它是由XXX.c(不包含main函数)文件编译而来的,分为静态库和动态库。

库在系统中的内容是不可见的,是一个二进制乱码

当程序需要使用库中的相关函数时,直接链接对应的库即可,无需跟对应的 源文件一起联合编译

作用:能够保证源代码的安全性

库在不同的系统中的表现方式也是不同的

windows下:
    静态库:XXX.lib
    动态库:XXX.dll

linux下
    静态库:libXXX.a
    动态库:libXXX.so

二、静态库

2.1 概念

所谓静态库,就是将一个XXX.c的源文件,编译生成一个libXXX.a的二进制文件。

当程序需要使用源文件中的函数时,只需要链接上该源文件生成的静态库文件即可直接调用相关函数,无需跟源文件联合编译

静态体现在:静态库在跟主程序一起生成可执行程序时,会将静态库完整的放入可执行程序中,每个可执行程序中都独立拥有整个静态库。函数调用时,效率比较高,但是,可执行程序的体积比较大。

2.2 静态库的制作

1> 准备文件

/********************************test.h**************************/
#define TEST_H

#include<myhead.h>

//声明求和函数
int qiuhe(int m, int n);


//声明求最值函数
int qiuzuida(int m, int n);


#endif

/********************************test.c**************************/
//声明求和函数
int qiuhe(int m, int n)
{
    return m+n;
}


//声明求最值函数
int qiuzuida(int m, int n)
{
    return m>n?m:n;
}
/********************************main.c**************************/
#include"test.h"

int main(int argc, const char *argv[])
{
    printf("sum = %d\n", qiuhe(3,5));
    printf("max = %d\n", qiuzuida(3,5));

    printf("%lf\n", pow(2,3));
    
    return 0;
}

2> 编译生成静态库

1、gcc -c XXX.c -o XXX.o                //只编译不链接生成二进制文件
2、ar -crs libXXX.a XXX.o                //将XXX.o的二进制文件编译生成libXXX.a的静态库
一个静态库依赖多个.o文件:ar -crs libXXX.a XXX.o  AAA.o  BBB.o              //将XXX.o的二进制文件编译生成libXXX.a的静态库
    ar :指令表示要编译生成静态库
    -c:create,表示创建静态库
    -r:replace,表示如果XXX.o文件已经存在,则被新的文件替换
    -s:重置静态库索引

3> 静态库的使用

gcc main.c -L 库的路径 -I 头文件路径 -l库名 -o 可执行程序

4> 分文件情况下的操作

三、动态库

3.1 概念

所谓动态库,就是将一个XXX.c的源文件,编译生成一个libXXX.so的二进制文件。

当程序需要使用源文件中的函数时,只需要链接上该源文件生成的动态库文件即可直接调用相关函数,无需跟源文件联合编译

动态体现在:动态库在跟主程序一起生成可执行程序时,只是将相关函数的入口地址列表编译到可执行程序中,当执行到对应的函数调用时,会根据该函数的入口地址,找到对应的动态库,执行该库中的函数。不会将整个库封装到可执行程序中。多个可执行程序可以连接同一个动态库,所以动态库也称为共享库。动态库的体积较小,但是,执行效率没有静态库高。

3.2 动态库的制作

1、gcc -fPIC -c XXX.c -o XXX.o               //只编译不链接生成二进制文件, -fPIC表示忽略文件位置进行编译
2、gcc -shared XXX.o -o libXXX.so           //编译生成动态库
    多个程序共同生成动态库:gcc -shared XXX.o AAA.o BBB.o -o libXXX.so

s也可以将上面的两个操作合成一个
    gcc -fPIC -shared XXX.c -o libXXX.so

3.3 动态库的使用

gcc main.c -L 库的路径 -I 头文件路径 -l库名 -o 可执行程序

3.4 如何解决上述问题

1> 修改当前终端的路径常量为库的路径

export LD_LIBRARY_PATH=库的路径

注意:该方式只能对当前终端有效,其他终端无效

2> 直接将自定义的动态库放入到系统中的库中

/lib /usr/lib

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

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

相关文章

PyTorch升级之旅——安装与基本知识

目录 一、安装 二、张量 创建tensor 张量的操作 广播机制 三、自动求导 四、并行计算 &#xff08;一&#xff09;网络结构分布到不同的设备中(Network partitioning) &#xff08;二&#xff09;同一层的任务分布到不同数据中(Layer-wise partitioning) &#xff08;…

Linux下编译安装redis-哨兵模式

Linux下编译安装-哨兵模式 哨兵sentinel模式 sentinel相当于是一个投票者或者哨兵&#xff0c;它时刻监视着redis集群的各个服务器&#xff0c;当主master挂了之后&#xff0c;它将进行投票进行新master的选举。下图 Sentinel的工作方式 每个Sentinel以每秒钟一次的频率向…

python从入门到精通:数据容器

数据容器介绍 一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支持重复元素 是否可以修改 是否有序&#xff0…

Web3链上聚合器声呐已全球上线,开启区块链数据洞察新时代

在全球区块链技术高速发展的浪潮中&#xff0c;在创新发展理念的驱动下&#xff0c;区块链领域的工具类应用备受资本青睐。 2024年8月20日&#xff0c;由生纳&#xff08;香港&#xff09;国际集团倾力打造的一款链上应用工具——“声呐链上聚合器”&#xff0c;即“声呐链上数…

数据分析实操案例分享:如何对人事数据进行BI分析?

在数据驱动时代&#xff0c;数据分析已经成为企业和个人获取竞争优势的关键技能。特别是在人力资源管理领域&#xff0c;数据分析的应用正变得越来越重要。通过对在职和离职数据的深入分析&#xff0c;企业不仅能够洞察员工的动态&#xff0c;揭示员工流动的模式、预测人才需求…

快速体验微软TTS服务

微软的语音合成服务&#xff08;TTS&#xff09;拥有500多种高品质的音色&#xff0c;并且在全球都有节点可以接入&#xff0c;在国内访问延迟可以控制在毫秒级。下面介绍在不需要编码的情况下&#xff0c;如何快速体验微软TTS的效果。 方式一、微软语音库UI界面 语音库地址&…

网安加·百家讲坛 | 裴伟伟:蓝牙音箱和耳机安全测评报告

作者简介&#xff1a;裴伟伟&#xff0c;洞源实验室创始人&#xff0c;国家网安基地网络安全行业专家&#xff0c;网安加社区特聘专家&#xff0c;持有CISSP、PMP证书&#xff0c;曾在HITCON、可信云大会、开源产业大会等安全论坛发表演讲。曾任国内某安全实验室负责人、某互金…

Oracle SQL - 合并重叠的期间

数据和目标 有如下数据存储了各组件的有效期间&#xff08;此处起止日期用数字代替以便查阅&#xff09;&#xff0c;目标为将有重叠的期间合并到一起。 SQL> SELECT * FROM demo_eff_periods;COMPONENT_ITEM_ID EFFECTIVITY_DATE DISABLE_DATE ----------------- -------…

Spring GateWay自定义断言工厂

文章目录 概要整体架构流程最终的处理效果小结 概要 我们在线上系统部署了&#xff0c;灰度环境和生产环境时&#xff0c;可以通过自定义断言工厂去将请求需要路由到灰度环境的用户调用灰度的的服务集群&#xff0c;将正常的用户调用正常集群。 这样&#xff0c;我们可以在上线…

【UCB CS61C】Lecture 1 - Number Representation 数制

目录 进制的定义常用的进制与换算十进制到二进制的转换二进制到十六进制、十六进制到二进制的转换二进制向 n 进制的转换 有符号数处理&#xff08;Signed Representation&#xff09;无符号整数&#xff08;Unsigned Integers&#xff09;有符号整数&#xff08;Signed Interg…

亚德诺(ADI)超静音步进电机驱动芯片——TMC2209

芯品快报:德州仪器(TI)的高性能、集成式的双全桥电机驱动器——DRV8412 芯品快报:亚德诺(ADI)超静音步进电机驱动芯片——TMC2209 原创 IPBrain平台君 集成电路大数据平台 2024年08月16日 19:18 北京 平台君今天给大家介绍一款亚德诺(ADI)公司的用于两相步进电机的超…

Elasticsearch 使用误区之四——不合理的使用 track_total_hits

0、企业级实战问题 在使用 Elasticsearch 进行搜索时&#xff0c;我们常常关心匹配查询的文档总数而将 track_total_hits 设置为 true&#xff0c;如下截图所示&#xff0c;在数据量非常大的情况下这种检索导致的问题是&#xff1a;查询特别慢&#xff0c;聚合会更慢&#xff0…

RKNN在转换过程中的均值和方差设置问题

为什么ONNX转RKNN要匹配均值和方差&#xff1f; 因为不匹配精度会下降&#xff01;&#xff01;&#xff01; 一般的类似于YOLO模型 YOLO模型在ONNX转RKNN时rknn.config设置为 一些其他模型将数据送入模型时会进行前处理&#xff0c;前处理会设置均值和方差&#xff0c;则在转…

【Nginx】实现 FastCGI

为什么会有 FastCGI &#xff1f; CGI 协议虽然解决了语言解析器和 Web Server 之间通讯的问题&#xff0c;但是它的效率很低&#xff0c;因为 Web Server每收到一个请求都会创建一个CGI 进程&#xff0c; PHP 解析器都会解析 php.ini 文件&#xff0c;初始化环境&#xff0c…

LCP142 环形链表[leetcode-7]

LCP142 环形链表 先上结果 前排提醒&#xff0c;本文有两种解法&#xff0c;和原理分析 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次…

数据结构与算法 - 设计

1. LRU缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0…

0819、0820梳理及一些面试题梳理

一、抓包分析 二、HTTP服务器 三、动态库与静态库 四、一些面试题 指针数组和数组指针的区别&#xff1a;指针数组本质是一个数组&#xff0c;只是数组中存储的是指针变量。数组指针存储的是该数组的起始地址&#xff0c;对该指针来说每偏移一个单位就是偏移了一整个数组的地…

如何寻找专业精密机械零件代加工工厂

在现代工业生产中&#xff0c;精密机械零件的加工质量直接关系到产品的性能和可靠性。因此&#xff0c;寻找一家专业的精密机械零件代加工工厂至关重要。以下时利和整理分享的一些关于寻找专业精密机械零件代加工工厂的关键步骤和要点&#xff0c;帮助你找到合适的合作伙伴。 首…

想投资现货黄金?在TMGM开户需要多少钱?

最近&#xff0c;越来越多的人开始关注黄金投资&#xff0c;希望通过黄金来对冲风险、保值增值。而选择一家可靠的交易平台是进行黄金投资的第一步。TMGM作为全球知名的外汇交易商&#xff0c;也为投资者提供了黄金交易服务。那么&#xff0c;在TMGM开户投资黄金&#xff0c;需…

尚硅谷VUE项目实战,前端项目-尚品汇2

尚硅谷VUE项目实战&#xff0c;前端项目-尚品汇2 1、路由传参 2、重写push