day33

一、linux系统中的库


库在linux系统中是一个二进制文件,它是由XXX.c(不包含main函数)文件编译而来的,分为静态库和动态库。
库在系统中的内容是不可见的,是一个二进制乱码
当程序需要使用库中的相关函数时,直接链接对应的库即可,无需跟对应的 源文件一起联合编译
作用:能够保证源代码的安全性
库在不同的系统中的表现方式也是不同的
windows下:
    静态库:XXX.lib
    动态库:XXX.dll
 
linux下
    静态库:libXXX.a
    动态库:libXXX.so
库的生成过程:printf    --->  stdio.c    -----> libc.so   <-----  -lc  ----   a.out
 


二、静态库


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.rhkb.cn/news/404872.html

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

相关文章

安装docker 遇到异常Could not resolve host: mirrorlist.centos.org; 未知的错误

问题 安装docker 遇到异常 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误” 1、安装Docker依赖包 yum install …

基于SpringBoot的论坛系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

Android 12系统源码_多屏幕(二)模拟辅助设备功能开关实现原理

前言 上一篇我们通过为Android系统开启模拟辅助设备功能开关&#xff0c;最终实现了将一个Activity显示到多个屏幕的效果。 本篇文章我们具体来分析一下当我们开启模拟辅助设备功能开关的时候&#xff0c;Android系统做了什么哪些操作。 一、模拟辅助设备功能开关应用位置 …

存储实验:华为异构存储在线接管与在线数据迁移(Smart Virtualization Smart Migration 特性)

目录 目的实验环境实验步骤参考文档1. 主机安装存储多路径2. v2存储创建Lun&#xff0c;映射给主机&#xff1b;主机分区格式化&#xff0c;写数据3. 将v2存储映射该成映射到v3存储上(v3存储和v2之间链路搭建&#xff0c;测通&#xff0c;远端设备&#xff09;&#xff08;Smar…

便利店(超市)管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

中国:“虚拟资产”交易被列为公认的洗钱方式之一!最高法院承认加密货币交易!

2024年8月19日&#xff0c;最高人民法院和最高人民检察院表示&#xff0c;根据他们对反洗钱法的新解释&#xff0c;“虚拟资产”交易现已被列为公认的洗钱方式之一。这是中国首次针对此类资产类别采取此类举措&#xff0c;说明为应对加密货币和其他虚拟资产日益增长的使用&…

IO进程线程8.20

1.使用fgets获取文件的行号 #include <myhead.h> int main(int argc, const char *argv[]) {FILE *fp fopen("./1.txt","r");if(fpNULL){perror("fp");return -1;}char buf[30];int count 0;while(fgets(buf,sizeof(buf),fp)){count;}p…

为IntelliJ IDEA安装插件

安装插件 插件是开发工具的扩展程序&#xff0c;通常由第三方提供&#xff0c;当安装了插件后&#xff0c;原开发工作的菜单、按钮等开发环境可能会发生变化&#xff0c;例如出现了新的菜单项&#xff0c;或出现了新的按钮&#xff0c;甚至一些全新的编码方式&#xff0c;通常…

双向链表复习(C语言版)

目录 链表分类&#xff1a; 双向链表初始化&#xff1a; 双向链表的插入&#xff1a; 双向链表的打印&#xff1a; 双向链表的删除&#xff1a; 双向链表的指定结点位置查找&#xff1a; 双向链表的在指定位置之后插入数据&#xff1a; 注意&#xff1a;通过上文的指定…

地理科学专业| 中国大学排行榜(2024年)

地理科学专业| 中国大学排行榜&#xff08;2024年&#xff09;

客车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

制造业正经历着前所未有的变革&#xff0c;其中客车制造行业作为传统制造业的重要组成部分&#xff0c;正积极拥抱5G、工业物联网及数字孪生等先进技术&#xff0c;推动生产模式的全面升级与数字化转型。 客车制造5G智能工厂工业物联数字孪生平台的出现&#xff0c;不仅为行业…

【Linux】系列入门摘抄笔记-8-权限管理chmod/chown

Linux操作系统中文件的基本权限由9个字符组成&#xff0c;分别为属主、属组和其他用户&#xff0c;用于规定是否对文件有读、写和执行权限。 文件/目录的权限与归属 目录列表中&#xff0c;有9列 第一列&#xff1a;文件类型与权限&#xff08;共10个字符&#xff0c;分为四组…

电子木鱼+提肛+游戏地图,车机还能这么玩?

文/王俣祺 导语&#xff1a;电子木鱼、提肛训练、游戏级地图&#xff0c;你很难想象这些“直男关怀”是来自小鹏MONA M03的车机系统。最近&#xff0c;一批关于MONA M03车机功能的视频在网上疯传&#xff0c;一系列“没用但有趣”的功能广受年轻用户的好评&#xff0c;情绪价值…

linux上用anaconda创建一个新环境,并将nicegui的应用打包为一个可执行应用

先下载好anaconda linux版本 Download Anaconda Distribution | Anacondahttps://www.anaconda.com/download/之后运行 conda create --name py311 python3.11 --name py311 是环境名 python3.11 是python版本 安装完成后&#xff0c;运行 conda env list 得到 这时我们…

手机使用技巧:如何恢复Android手机不见的短信

在您的 Android 手机上丢失短信可能是一种令人沮丧的经历&#xff0c;尤其是在文本包含重要信息的情况下。幸运的是&#xff0c;有一些方法可以在Android上恢复已删除的短信。在这篇博文中&#xff0c;我们将讨论几种在Android手机上恢复已删除短信的方法。 为什么需要恢复Andr…

【python】逐步回归(多元线性回归模型中的应用)

文章目录 前言一、逐步回归1. 前进法&#xff08;Forward Selection&#xff09;2. 后退法&#xff08;Backward Elimination&#xff09;3. 逐步回归法&#xff08;Stepwise Regression&#xff09; 二、示例三、代码实现----python 前言 Matlab中逐步回归的实现可以使用 Mat…

软体水枪在灭火工作中发挥什么作用_鼎跃安全

火灾&#xff0c;这一频繁侵袭我们日常生活的灾难性事件&#xff0c;以其迅猛之势对人类的生存环境与日常生活构成了极其严重的破坏与威胁。它不仅能够在瞬间吞噬财产&#xff0c;更可怕的是&#xff0c;它无情地剥夺了生命&#xff0c;破坏了家庭&#xff0c;给社会留下了难以…

关于Ubuntu中使用命令行安装Qt的一些分享

以Ubuntu 22.04为例。 1、安装默认的Qt库 sudo apt-get install qtbase5-dev qtbase5-dev-tools qtchooser 这条指令执行完会出现 usr/lib/x86_64-linux-gnu/qt5 文件&#xff0c;并伴随5个子文件夹&#xff0c;结构如下&#xff1a; 并且会出现 usr/lib/qt5, usr/lib/x86_6…

第5节:Elasticsearch核心概念

我的后端学习笔记大纲 我的ElasticSearch学习大纲 1.Lucene和Elasticsearch的关系: 1.Lucene&#xff1a;最先进、功能最强大的搜索库&#xff0c;直接基于lucene开发&#xff0c;非常复杂&#xff0c;api复杂2.Elasticsearch&#xff1a;基于lucene&#xff0c;封装了许多luc…

SpringBoot的自动配置原理探究

目录 什么是SpringBoot的自动配置&#xff08;Auto-Configuration&#xff09; 举例&#xff1a;SpringBoot自动配置&#xff08;Redis的自动配置&#xff09;的实例&#xff1a; 步骤1.&#xff1a;引入Redis启动器pom依赖 步骤2.在application.yml或者&#xff08;proper…