Linux 的静态库和动态库

本文目录

  • 一、静态库
    • 1. 创建静态库
    • 2. 静态库的使用
  • 二、动态库
    • 1. 为什么要引入动态库呢?
    • 2. 创建动态库
    • 3. 动态库的使用
    • 4. 查看可执行文件依赖的动态库

  

一、静态库

   在编译程序的链接阶段,会将源码汇编生成的目标文件.o与引用到的库(包括静态库)的二进制文件一起链接打包到最终的可执行文件中。

静态库常以.a.lib为后缀。
   静态库命名规范:lib[name].a,其中lib是静态库前缀,中间[name]为静态库名称,最后.a为静态库后缀。例如:libaddfunc.a,其中addfunc才是静态库的名称。

1. 创建静态库

   在使用创建静态库前,为了使得工程目录更加清晰,我们创建三个文件夹lib(存放.h文件)、src(存放.c文件)、debug(存放.o文件)

(1)编写库文件。
fun1.c

#include "stdio.h"int add(int a, int b)
{return a+b;
}

fun1.h

#include "stdio.h"int add(int a, int b);

将编写好的库文件存放到不同的文件夹里。

(2)将库文件编译为目标文件(.o)
  使用命令:gcc -c ./src/fun1.c -o ./debug/fun1.o,在debug目录下生成fun1.o目标文件。

(3)创建封装静态库
  使用ar工具,并添加命令 rcs,将debug文件夹里的所有的.o文件进行封装为静态库libaddfunc.a
  如:ar rcs libaddfunc.a ./debug/*.o。此时libaddfunc.a就是静态库。其中addfunc是静态库的名称。
在这里插入图片描述

2. 静态库的使用

(1)编写main.c源码文件

main.c

#include "fun1.h"
#include "stdio.h"int main()
{int a=8;int b=10;int sum=0;sum=add(a,b);printf("%d\n"sum);
}

(2)编译源码时链接静态库,生成可执行文件。
  命令:gcc main.c -o main -I ./lib -L ./ -l addfunc
   -I ./lib :表示头文件所在的路径。
   -L ./ :表示静态库所在的路径,此处为当前路径。
   -l addfunc:表示要连接的静态库名称,addfunc为静态库名称。

在这里插入图片描述

(3)运行可执行文件。
在这里插入图片描述

二、动态库

   在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。

动态库常以.so.dll为后缀。
   动态库命名规范:lib[name].a,其中lib是动态库前缀,中间[name]为动态库名称,最后.so为动态库后缀。例如:libsubfunc.so,其中subfunc才是动态库的名称。

1. 为什么要引入动态库呢?

   答:因为在静态库存在一个弊端,就是当我们对库文件添加或修改了部分内容,将其生成新的静态库文件后,我们需要将所有使用该库文件的程序文件都要重新编译。因为当静态库修改后,其二进制文件也会改变。静态库在程序编译链接阶段,将字节的二进制文件一同打包到程序的可执行文件中。所以静态库改变后,需要将使用了该静态库的可执行文件都需要重新进行编译。这样就会特别繁琐,所以引入了动态库。
   动态库只会在程序运行时载入。动态库作为一个独立的文件存在于系统中,可以被多个文件共享使用,当动态库进行维护时,只需要将新的动态库文件替换旧的动态库文件即可,不需要对使用动态库的文件程序重新编译,这就是动态库的好处。

2. 创建动态库

举例使用的库文件我们使用上述静态库时的库文件。同样存放到不同的文件夹中。

(1)将库文件生成目标文件(.o)

  使用命令:gcc -fpic -c ./src/fun1.c -o ./debug/fun1.o,在debug目录下生成fun1.o目标文件。

(2)生成动态库–共享库
  使用命令:gcc -shared ./debug/*.o -o libfun2.so。其中libfun2.so为动态链接库,也称共享库。
在这里插入图片描述

3. 动态库的使用

(1)编译源码,生成可执行文件
使用命令:gcc main.c -o main -I ./lib -L ./ -l fun2
   -I ./lib :表示头文件所在的路径。
   -L ./ :表示动态库所在的路径,此处为当前路径。
   -l addfunc:表示要连接的动态库名称。
在这里插入图片描述
  虽然这里我们也指定了动态库的路径,但是动态库在编译可执行文件时并不会进行链接,而是在执行时才会进行链接!所以当我们维护动态库时,才不会对所使用动态库的文件进行重新编译。

(2)将库路径添加到系统加载器
   生成的可执行文件,当我们执行时,会发生以下错误,原因是我们虽然告诉了编译器库文件和头文件的路径所在位置,但是当编译器编译好后,就与编译器无关了;当我们执行(运行)可执行程序时,是由加载器来完成的。所以我们需要在运行时,告诉系统库文件在哪里。
在这里插入图片描述

 方法一:将libfun2.so添加到/usr/lib/下, 使用命令:sudo cp libfun2.so /usr/lib/进行添加。不推荐!
 方法二:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/qjl , LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径。
在这里插入图片描述

(3)运行可执行文件
在这里插入图片描述

4. 查看可执行文件依赖的动态库

使用命令:ldd 可执行文件
在这里插入图片描述

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

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

相关文章

对话访谈——五问RAG与搜索引擎:探索知识检索的未来

记一次关于RAG和搜索引擎在知识检索方面的对话访谈,针对 RAG 与传统搜索引擎的异同,以及它们在知识检索领域的优劣势进行了深入的探讨。 Q:传统搜索引擎吗,通过召回-排序的两阶段模式,实现搜索逻辑的实现,当前RAG技术也…

数字旅游:通过科技赋能,创新旅游服务模式,提供智能化、个性化的旅游服务,满足游客多元化、个性化的旅游需求

目录 一、数字旅游的概念与内涵 二、科技赋能数字旅游的创新实践 1、大数据技术的应用 2、人工智能技术的应用 3、物联网技术的应用 4、云计算技术的应用 三、智能化、个性化旅游服务的实现路径 1、提升旅游服务的智能化水平 2、实现旅游服务的个性化定制 四、数字旅…

想要接触网络安全,应该怎么入门学习?

作为一个网络安全新手,首先你要明确以下几点: 我刚入门网络安全,该怎么学?要学哪些东西?有哪些方向?怎么选?这一行职业前景如何? 其次,如果你现在不清楚学什么的话&…

vim的IDE进阶之路

一 ctags 1 安装 安装ctags比较简单,我用的是vim-plug,网络上随便一搜应该就有很多教程,而且没有什么坑 2 使用 vim之函数跳转功能_nvim函数跳转-CSDN博客https://blog.csdn.net/ballack_linux/article/details/71036072不过针对cuda程序…

Java基础_集合类_List

List Collection、List接口1、继承结构2、方法 Collection实现类1、继承结构2、相关类(1)AbstractCollection(2)AbstractListAbstractSequentialList(子类) 其它接口RandomAccess【java.util】Cloneable【j…

【LAMMPS学习】八、基础知识(5.3)Body particles体粒子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Go 学习笔记

Go 学习相关笔记 Go 官方的教学文档顺序不怎么友好,这里根据我自己的学习曲线来记录文档的查看顺序 基础知识 文档预备 新手先要看 Go 的模块管理介绍,这样才知道基础 Go 怎么导入外部包和进行本地的包管理 https://go.dev/doc/modules/managing-dep…

【快速入门】数据库的增删改查与结构讲解

文章的操作都是基于小皮php study的MySQL5.7.26进行演示 what 数据库是能长期存储在计算机内,有组织的,可共享的大量数据的集合。数据库中的数据按照一定的数据模型存储,具有较小的冗余性,较高的独立性和易扩展性,并为…

本地CPU搭建知识库大模型来体验学习Prompt Engineering/RAG/Agent/Text2sql

目录 1.环境 2.效果 3.概念解析 4.架构图 5. AI畅想 6.涉及到的技术方案 7. db-gpt的提示词 1.环境 基于一台16c 32G的纯CPU的机器来搭建 纯docker 打造 2.效果 3.概念解析 Prompt Engineering : 提示词工程 RAG: 检索增强生成; …

CTFHub-Web-SQL注入

CTFHub-SQL注入-WP 1.整数型注入 1.题目说输入1,先将1输入查看结果 2.接着输入4-1,发现输出的结果为4-1,判定存在整数型注入 3.查询字段数,出现了回显,判断这里的字段数为2 1 order by 24.判断注入点在2的位置&…

复杂度(3)

目录 1.二分查找的时间复杂度 2.斐波那契数列及其优化 3.空间复杂度 1.二分查找的时间复杂度 我们熟知的二分查找绝对是一种很厉害的算法,因为这个算法每进行一次都会砍掉一半的数据,相当于是指数级增长,假设我们刚开始的时候数据的个数是…

MS8241/MS8242高速、高输出电流、电压反馈放大器

产品简述 MS8241/MS8242 是一颗高速的电压反馈放大器,具有电流 反馈放大器的高速转换特性,可以应用在所有传统的电压反馈运 放应用方案中。 MS8241/MS8242 能够稳定工作在低增益环路下 (增益为 2 和 -1 ),仅消耗…

Java项目:基于SSM框架实现的实践项目管理系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的实践项目管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff…

【算法】【贪心算法】【leetcode】870. 优势洗牌

题目地址:https://leetcode.cn/problems/advantage-shuffle/description/ 题目描述: 给定两个长度相等的数组 nums1 和 nums2,nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。 返回 nums1 的任意排列&…

HTML5(1)

目录 一.HTML5(超文本&#xff08;链接&#xff09;标记&#xff08;标签<>&#xff09;语言) 1.开发环境&#xff08;写代码&#xff0c;看效果&#xff09; 2.vscode 使用 3.谷歌浏览器使用 4.标签语法 5.HTML基本骨架&#xff08;网页模板&#xff09; 6.标签的…

【配置】Docker搭建JSON在线解析网站

云服务器打开端口8787 连接上docker运行 docker run -id --name jsonhero -p 8787:8787 -e SESSION_SECRETabc123 henryclw/jsonhero-webhttp://ip:8787访问 Github&#xff1a;地址

透视天气:数据可视化的新视角

数据可视化在天气方面能够为我们带来极大的帮助。天气是人类生活中一个重要的因素&#xff0c;对于农业、交通、航空、能源等各个领域都有着重要的影响。而数据可视化技术通过将复杂的天气数据转化为直观、易懂的图表、图像或地图等形式&#xff0c;为我们提供了更深入、更全面…

接口测试 - postman

文章目录 一、接口1.接口的类型2. 接口测试3. 接口测试流程4. 接口测试用例1. 测试用例单接口测试用例-登录案例 二、HTTP协议1. HTTP请求2. HTTP响应 三、postman1. 界面导航说明导入 导出用例集 Get请求和Post请求的区别:2.postman环境变量和全局变量3. postman 请求前置脚本…

ECharts在网页中添加可视化图标-在网页中添加交互图表+option模块案列详解

一、引言 ECharts 是一个使用 JavaScript 编写的开源可视化库&#xff0c;它可以在浏览器中生成交互式的图表。无论是折线图、柱状图、散点图还是饼图&#xff0c;ECharts 都能轻松应对。本文将带领大家了解如何在网页中添加 ECharts 可视化图标。 本章可以直接跳到第五点完整…

【Spring基础】关于Spring IoC的那些事

文章目录 一、如何理解IoC1.1 Spring IOC 概述1.2 IoC 是什么 二、Ioc 配置的方式2.1 xml 配置2.2 Java 配置2.3 注解配置 三、依赖注入的方式3.1 setter方式3.2 构造函数3.3 注解注入 小结 一、如何理解IoC 1.1 Spring IOC 概述 控制反转 IoC(Inversion of Control)是一种设计…