3、Linux库的生成和使用(核心代码是程序员不可公开的小秘密)

目录

Linux库的概念

Linux 静态库

Linux 静态库作用

Linux 静态库的创建

1. 将.c文件生成.o文件

​编辑

2. 将所有的.o文件归档为一个静态库.a文件

Linux 静态库的使用

Linux 动态库:

Linux 动态库作用

Linux 动态库的创建

生成.so动态库文件

​编辑

Linux 动态库的使用

!!执行出错!!​编辑

解决办法

1、将生成的动态库拷贝到 /usr/lib 中

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径

总结


Linux库的概念

Linux静态库和动态库都是可重用的二进制代码块,它们可以使程序的编写更加高效和简洁

静态库会被编译并包含在程序中,因此当程序运行时,不需要外部依赖(在程序编译前就加入到目标程序中,而动态库会在运行时加载,因此多个程序可以共享同一个库,从而节省内存(在程序执行时动态地由目标程序去调用)。

Linux 静态库

Linux静态库是一种可重用的二进制代码块,它是链接到包含它的程序的一部分,因此当该程序运行时,不需要外部依赖。静态库的文件扩展名为“.a”,通常由一系列编译后的.obj或.o文件组成。

Linux 静态库作用

1. 简化代码的维护和升级:通过将常用的功能放在一个独立的库中,可以方便地维护和升级整个程序集。
2. 提高代码的安全性:静态库被完全集成到应用程序中,使得程序在没有网络连接的情况下也能正常运行,从而提高了代码的安全性。
3. 减少内存占用:由于静态库在编译时就被链接到程序中,所以不必担心重复加载,从而减少了内存占用。
4. 不受版本控制影响:因为静态库已经被完全包含在程序内部,所以不受其他程序的版本控制影响。

Linux 静态库的创建

在Linux环境中,可以通过以下步骤创建静态库:

1. 将.c文件生成.o文件

使用gcc编译器或其他合适的编译器,将所有要包含在库中的源代码文件编译成.o文件。

生成.o文件
gcc -c 文件名.c 

 继续使用上一小节工厂模式的代码将cat.c dog.c person.c 生成对应的.o文件

 

2. 将所有的.o文件归档为一个静态库.a文件

运行ar命令,将所有的.o文件归档为一个静态库文件(ar 指令是一个Unix/Linux系统中的档案管理工具,主要用于管理和处理备存文件(archive))

将.o文件生成.a静态库文件

ar rcs lib+要生成静态库的名字.a *.o 

//lib是library(库)的缩写
//*.o中“ * ”是通配符,表示该文件夹中的所有.o文件
//ar 命令中的 rcs 是 -rcs 参数组合的一个简写形式,分别代表以下几个动作:
    -r:追加档案到归档文件。
    -c:创建归档文件。如果指定的目标文件已经存在,则清空后再进行操作。
    -s:排序归档文件内的成员。
综合起来,-rcs 参数就是追加、清除及排序的意思。这意味着,如果你有一个已经存在的归档文件,你想向里面添加一些新的档案,那么应该使用 -rcs 参数,这样可以确保归档文件中的成员按照正确顺序排列。

 成功生成了名为libfactory.a的静态库文件

Linux 静态库的使用

在创建完静态库后,就可以在其他程序中使用它了。

这时我们可以删除(rm)/移动(mv)功能函数以及第一步生成的.o文件,只留下头文件、主函数和生成的静态库

在编译时,只需将库添加到链接器命令中

gcc 文件名.c -L./ -l静态库名(砍头去尾) -o 可执行文件名字

//砍头去尾是意思是:我们生成静态库名字是 libfactory.a,
使用-l链接的时候只需-lfactory即可,去掉lib和.a

不加-L ./会报错,因为-l链接的库默认在/usr/lib /usr/local/lib下面寻找,加上-L ./后告诉编译器在当前目录下寻找这个库,因为这个静态库是我们自己生成的

运行效果

Linux 动态库:

Linux动态库是一种共享的、可执行的二进制代码块,它在程序运行时被装载到内存中,因此它可以被多个进程同时使用,节省了内存资源。动态库的文件扩展名为“.so”,即Shared Object(共享对象)的缩写。

Linux 动态库作用

1. 节省空间:由于多个程序可以共享一个动态库,因此可以节省磁盘空间和内存。
2. 改进性能:动态库只在程序真正需要时才被载入内存,这样可以提高系统的整体性能。
3. 更新灵活:动态库可以单独更新而不必重新编译整个程序。
4. 提供更强的灵活性:动态库可以随时安装和卸载,无需重新编译程序。

Linux 动态库的创建

在Linux环境中,可以通过以下步骤创建动态库:

生成.so动态库文件

生成.so动态库文件
gcc -shared -fpic 文件名.c -o lib名字.so

//-shared 选项告诉 GCC 在生成目标文件时产生共享库(也就是动态链接库)。这表示你的程序可以动态链接到其他程序中,因此无需在运行时每次都加载整个库文件,而是只加载必要的部分。
//-fpic 是 Position Independent Code 的缩写,意为位置无关代码,它会让 GCC 在编译目标文件时创建一个独立于内存位置的代码,这样就可以在程序运行时改变动态库的内存位置。

Linux 动态库的使用

在创建完动态库后,就可以在其他程序中使用它了。

这时我们可以删除(rm)/移动(mv)功能函数以及第一步生成的.o文件,只留下头文件、主函数和生成的动态库

在编译时,只需将库添加到链接器命令

gcc 文件名.c -L./ -l动态库名(砍头去尾) -o 可执行文件名字

//砍头去尾是意思是:我们生成静态库名字是 libfactory.so,
使用-l链接的时候只需-lfactory即可,去掉lib和.so

不加-L ./会报错,因为-l链接的库默认在/usr/lib /usr/local/lib下面寻找,加上-L ./后告诉编译器在当前目录下寻找这个库,因为这个静态库是我们自己生成的

!!执行出错!!

 静态库编译后可以直接运行可执行文件但是动态库不可以:静态库会被编译并包含在程序中,因此当程序运行时,不需要外部依赖(在程序编译前就加入到目标程序中,而动态库会在运行时加载,(在程序执行时动态地由目标程序去调用,程序执行的时候才去寻找动态库)。

解决办法

1、将生成的动态库拷贝到 /usr/lib 中

 删除 /usr/lib 下的动态库方便验证法2

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径

export LD_LIBRARY_PATH="生成的动态库所在的文件夹路径"

树莓派中但这个命令是临时的只限于运行这个命令的窗口,换一个窗口就不行了(虚拟机不会)

写一个shell脚本解决这个问题

总结

静态库的优点在于它们不需要在运行时存在,而动态库需要在运行时可用,否则程序将无法启动。但另一方面,静态库会增加最终程序的大小,因为它们的代码被嵌入到了程序中,而动态库则是只在运行时加载,从而减小了程序的大小。此外,静态库比动态库更容易安全审计,因为它们是完全内置到程序中的。 总的来说,静态库适合于那些只需要少量更改并且不需要频繁更新的代码模块,而对于需要经常更新和更改的模块更适合使用动态库

动态链接库(Dynamic Link Library,也称作 Shared Library 或 Shared Object)在运行时才被加载到内存中,它的好处是可以被多个程序共享,只需要一份物理内存,节省了磁盘空间和内存资源,并且更容易被更新。
动态链接库还有以下优点:

  1. 当你需要更新模块的功能时,可以只更新动态链接库,不用重新编译程序
  2. 可以链接多个程序。
  3. 可以链接不同语言编写的程序。
  4. 可以降低模块之间的耦合度。

相反,静态链接库在编译时就会被链接进程序中,因此一旦发布就不能再更改,如果不重新编译程序就无法更新库的功能。
总的来说,如果模块需要经常更新或具有跨平台的需求,动态链接库是一个更好的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

curl(八)时间和环境变量以及配置

一 时间 ① --connect-timeout 连接超时时间 ② -m | --max-time 数据最大传输时间 -m&#xff1a; 限制curl 完成时间(overall time limit)-m,--max-time <seconds> 整个交互完成的超时时间场景&#xff1a; 通过设置-m参数,可以避免请求时间过长而导致的超时错误…

jstack java堆栈跟踪工具

jstack java堆栈跟踪工具 1、jstack介绍 jstack&#xff08;stack trace for java&#xff09;是java虚拟机自带的一种堆栈跟踪工具。 jstack主要用于生成java虚拟机当前时刻的线程快照&#xff0c;线程快照是当前java虚拟机内每一条线程正在执行的方法 堆栈的集合&#xf…

MacOS Ventura 13 优化配置(ARM架构新手向导)

一、系统配置 1、About My MacBook Pro 2、在当前标签打开新窗口 桌面上创建目录的文件夹&#xff0c;每次新打开一个目录&#xff0c;就会创建一个窗口&#xff0c;这就造成窗口太多&#xff0c;不太好查看和管理&#xff0c;我们可以改成在新标签处打开新目录。需要在&…

数字滤波器设计---IIR 滤波器设计

数字滤波器设计---IIR 滤波器设计 IIR 与 FIR 滤波器的比较 与 FIR 滤波器相比&#xff0c;IIR 滤波器的主要优点是&#xff0c;要满足同一组设定&#xff0c;它的滤波器阶数通常远远低于 FIR 滤波器。虽然 IIR 滤波器具有非线性相位&#xff0c;但 MATLAB 软件中的数据处理通…

【数据分享】我国雏鹰企业数据(excel格式\shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。 本次我们为大家带来的…

jumpserver任意密码重置漏洞-CVE-2023-42820

目录 jumpserver 环境搭建 这里用的是vulhub靶场 进入 jumpserver 的目录 修改配置文件 config.env 里面的 DOMAINS 参数为kali的地址 运行环境&#xff0c;第一次运行的话会拉取文件&#xff0c;要耐心等待。 命令&#xff1a; 查看docker容器 命令&#xff1a; 用浏…

【分享】Excel“只读方式”的两种模式

查阅Excel表格的时候&#xff0c;担心不小心修改了内容&#xff0c;可以给Excel设置以“只读方式”打开&#xff0c;这样就算修改了内容也不能直接保存表格。Excel表格可以设置两种“只读方式”&#xff0c;一起来看看吧&#xff01; “只读方式” 1&#xff1a; 打开Excel表…

找工作什么平台最可靠

吉鹿力招聘网是最可靠的找工作平台。可以直接和HR沟通岗位情况&#xff0c;方便快捷。同时&#xff0c;吉鹿力招聘网还有一些其他功能&#xff0c;比如可以找到更精准的人才&#xff0c;以及专业的招聘网站&#xff0c;可以帮助求职者找到合适的职位。吉鹿力招聘网还有一个特点…

【Linux进程】进程控制

目录 一、进程创建 1.2 fork函数初识 1.2 fork函数返回值 1.3 写时拷贝 1.4 fork常规用法 1.5 fork调用失败的原因 二、进程终止 2.1 进程退出场景 2.2 进程退出码 2.2.1 用strerror打印错误信息 2.2.2 errno全局变量 2.3 进程常见退出方法 2.3.1 进程正常退出 2…

Python高级语法----Python的元编程

文章目录 装饰器元类反射使用 `__getattr__`, `__setattr__`, 和 `__delattr__`元编程是一种编程技术,它允许程序员在运行时修改、增加或操作程序的结构。在Python中,元编程通常涉及到对类和函数的动态创建和修改,这是通过使用诸如装饰器、元类和反射等高级功能来实现的。 …

Java整合Redis实现坐标附近查询

目录 一、GEO用法引入 二、引入依赖 三、实体类 四、添加位置信息 五、查询位置信息 一、GEO用法引入 GEO&#xff0c;全称Geolocation&#xff0c;代表地理坐标。可以在其中存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a;GEOADD&…

数列计算

题目描述 有一列数是 : 请找出这个数列的规律&#xff0c;编写程序计算并输出这个数列的第项&#xff0c;要求是分数形式&#xff0c;并计算这个数列的前项和 ( 结果四舍五入保留两位小数 ) 输入格式 第一行仅有一个正整数 &#xff08;) 。 输出格式 共有 行&#xff0c;第一…

5+干湿结合的佳作,可另外添加分析升级

今天给同学们分享一篇生信文章“PCTAIRE Protein Kinase 1 (PCTK1) Suppresses Proliferation, Stemness,and Chemoresistance in Colorectal Cancer through the BMPR1B-Smad1/5/8 Signaling Pathway”&#xff0c;这篇文章发表在Int J Mol Sci期刊上&#xff0c;影响因子为5.…

Web APIs——综合案例学生就业统计表

1、学生就业统计表 2、渲染业务 根据持久化数据渲染页面 步骤&#xff1a; ①&#xff1a;读取localstorage本地数据 如果有数据则转换为对象放到变量里面一会使用它渲染页面如果没有则用默认空数组[]为了测试效果&#xff0c;可以先把initData存入本地存储看效果 ②&…

Monarch Mixer: A Simple Sub-Quadratic GEMM-Based Architecture

Monarch Mixer: A Simple Sub-Quadratic GEMM-Based Architecture 发于 2023年AI顶会 NeurIPS。 sub-quadratic primitive(次二次原语) GEMMs&#xff08;General Matrix Multiply algorithms&#xff09;是指在许多核心系统上执行的通用矩阵乘法操作的模型。 “causal model…

idea2023启动springboot项目如何指定配置文件

方法一&#xff1a; 方法二&#xff1a; 举例&#xff1a;

blockly编程简介

blockly编程简介 blockly是google发布的可视化编程工具&#xff0c;基于web技术构建。 在功能/设计上和MIT的儿童编程语言Scratch类似&#xff0c;采用可视化搭积木编程方式。 可以将基于block程序转化为基于普通文本的常规代码&#xff08;如JavaScript、Python等&#xff…

基于flask+bootstrap4实现的注重创作的轻博客系统项目源码

一个注重创作的轻博客系统 作为一名技术人员一定要有自己的博客&#xff0c;用来记录平时技术上遇到的问题&#xff0c;把技术分享出去就像滚雪球一样会越來越大&#xff0c;于是我在何三博客的基础上开发了[l4blog]&#xff0c;一个使用python开发的轻量博客系统&#xff0c;…

echarts饼图label显示不全原因?

echarts饼图label显示不全原因&#xff1f; 标签数量过多&#xff1a;当饼图的扇形数量较多时&#xff0c;为了保证图形的清晰性&#xff0c;ECharts 可能不会显示所有的标签&#xff0c;而是选择显示部分标签或者不显示标签。标签过长&#xff1a;如果标签的文字过长&#xf…

问卷调查表单、表设计

一、DWSurvey实现&#xff1a; 参考文档&#xff1a;快速入门 | 调问开源问卷系统 管理员通过拖拽题型生成表单&#xff0c; 点击保存&#xff0c;预览&#xff0c;发布问卷。用户根据预览的地址&#xff0c;填写问卷提交。管理员可以在我的问卷里看到答卷情况。 关于数据存…