C语言----静态链接库和动态链接库
在前面的文章中讲到可执行程序的生成需要经过预处理,编译,汇编和链接四个步骤,链接阶段是链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。
需要解读一下库文件,我们可以将库文件等价为压缩包文件,该文件内部通常包含不止一个目标文件(也就是二进制文件)。值得一提的是,库文件中每个目标文件存储的代码,并非完整的程序,而是一个个实用的功能模块。例如,C 语言库文件提供有大量的函数(如 printf()、memset()、strlen() 等),C++ 库文件不仅提供有使用的函数,还有大量事先设计好的类(如 string 字符串类)。
库文件的产生,极大的提高了程序员的开发效率,因为很多功能都是现成并且很成熟,使用者根本不需要重新造轮子,直接调取包含该功能的库文件即可。并且,库文件的调用方法也很简单,以 C 语言中的 printf() 输出函数为例,程序中只需引入 <stdio.h> 头文件,即可调用 printf() 函数。
对于初学者需要区分一下库文件和头文件,库文件我们看不到里面的内容,头文件我们确可以实实在在的看到。那么调用库文件为什么还要牵扯到头文件呢?首先,头文件和库文件并不是一码事,它们最大的区别在于:头文件只存储变量、函数或者类等这些功能模块的声明部分,库文件才负责存储各模块具体的实现部分。读者可以这样理解:所有的库文件都提供有相应的头文件作为调用它的接口。也就是说,库文件是无法直接使用的,只能通过头文件间接调用。
事实上,库文件只是一个统称,代指的是一类压缩包,它们都包含有功能实用的目标文件。要知道,虽然库文件用于程序的链接阶段,但编译器提供有 2 种实现链接的方式,分别称为静态链接方式和动态链接方式,其中采用静态链接方式实现链接操作的库文件,称为静态链接库;采用动态链接方式实现链接操作的库文件,称为动态链接库。
一:静态库和动态库的概念
1,静态库
静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。
链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。
这里的库指的是静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
2,动态库
动态链接(Dynamic Linking
),把链接这个过程推迟到了运行时再进行,在可执行文件装载时或运行时,由操作系统的装载程序加载库。
这里的库指的是动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
值得一提的是,在Windows下的动态链接也可以用到.lib为后缀的文件,但这里的.lib文件叫做导入库,是由.dll文件生成的。
二:静态库和动态库比较
1,静态库优缺点
静态链接库实现链接操作的方式很简单,即程序文件中哪里用到了库文件中的功能模块,GCC 编译器就会将该模板代码直接复制到程序文件的适当位置,最终生成可执行文件。
使用静态库文件实现程序的链接操作,既有优势也有劣势:
- 优势是,生成的可执行文件不再需要任何静态库文件的支持就可以独立运行(可移植性强);
- 劣势是,如果程序文件中多次调用库中的同一功能模块,则该模块代码势必就会被复制多次,生成的可执行文件中会包含多段完全相同的代码,造成代码的冗余。
和使用动态链接库生成的可执行文件相比,静态链接库生成的可执行文件的体积更大。在 Linux 发行版系统中,静态链接库文件的后缀名通常用 .a 表示;在 Windows 系统中,静态链接库文件的后缀名为 .lib。
2,动态库优缺点
动态链接库,又称为共享链接库。和静态链接库不同,采用动态链接库实现链接操作时,程序文件中哪里需要库文件的功能模块,GCC 编译器不会直接将该功能模块的代码拷贝到文件中,而是将功能模块的位置信息记录到文件中,直接生成可执行文件。
显然,这样生成的可执行文件是无法独立运行的。采用动态链接库生成的可执行文件运行时,GCC 编译器会将对应的动态链接库一同加载在内存中,由于可执行文件中事先记录了所需功能模块的位置信息,所以在现有动态链接库的支持下,也可以成功运行。
采用动态链接库实现程序的连接操作,其优势和劣势恰好和静态链接库相反:
- 优势是,由于可执行文件中记录的是功能模块的地址,真正的实现代码会在程序运行时被载入内存,这意味着,即便功能模块被调用多次,使用的都是同一份实现代码(这也是将动态链接库称为共享链接库的原因)。
- 劣势是,此方式生成的可执行文件无法独立运行,必须借助相应的库文件(可移植性差)。
和使用静态链接库生成的可执行文件相比,动态链接库生成的可执行文件的体积更小,因为其内部不会被复制一堆冗余的代码。在 Linux 发行版系统中,动态链接库的后缀名通常用 .so 表示;在 Windows 系统中,动态链接库的后缀名为 .dll。
三:实战
下面基于Linux来展示静态库和动态库。
我们先准备三个文件
cprocess.c
#include "cprocess.h"int add(int a, int b)
{return a + b;
}
cprocess.h
#ifndef __CPROCESS_H
#define __CPROCESS_H#include <stdio.h>
#include <stdlib.h>int add(int a, int b);#endif
main.c
#include "cprocess.h"int main()
{int a = 10;int b = 20;printf("10+20=%d",add(a,b));
}
1,静态链接实践
将.c生成目标文件
gcc -c main.c cprocess.c
接下来使用ar工具把cprocess.o
和main.o
打包成一个静态库文件libProcess.a
,输入命令
ar rv libProcess.a cprocess.o main.o
最后一步把静态库链接成可执行文件 ,运行
gcc libProcess.a -o cprocess
2,动态链接实践
把cprocess.c编译成动态库文件libProcess.so
gcc cprocess.c -shared -o libProcess.so
用该动态库文件libProcess.so
与main.c
一起编译生成可执行文件cprocess
gcc main.c /home/cLearning/cprocess/libProcess.so -o cprocess
这里链接动态库用的是绝对路径,如果不用绝对路径,该实践的路径又不是在Linux的环境变量中,就会出现找不到动态库的情况
./cprocess: error while loading shared libraries: libProcess.so: cannot open shared object file: No such file or directory
相关文章:

C语言----静态链接库和动态链接库
在前面的文章中讲到可执行程序的生成需要经过预处理,编译,汇编和链接四个步骤,链接阶段是链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。 需要解读一下库文件,我们可以将库文件等价为压缩包文件&…...

PCA(主成分分析)数据降维技术代码详解
引言 随着大数据时代的到来,我们经常会面临处理高维数据的问题。高维数据不仅增加了计算复杂度,还可能引发“维度灾难”。为了解决这一问题,我们需要对数据进行降维处理,即在不损失太多信息的前提下,将数据从高维空间…...

Git版本控制系统之分支与标签(版本)
目录 一、Git分支(Branch) 1.1 分支作用 1.2 四种分支管理策略 1.3 使用案例 1.3.1 指令 1.3.2 结合应用场景使用 二、Git标签(Tag) 2.1 标签作用 2.2 标签规范 2.3 使用案例 2.3.1 指令 2.3.2 使用示例 一、Git分支&…...

JSP运行环境搭建
将安装JSP引擎的计算机称作一个支持JSP的Web服务器。这个服务器负责运行JSP,并将运行结果返回给用户。 JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分之一。一个简单Web应用程序可能只有一个JSP页面,而一个复杂的Web应用程序可能由许多JSP…...
React通过属性 (props) 和状态 (state) 来传递和管理组件的数据
import React, { useState } from react;// 子组件 const ChildComponent (props) > {return (<div><h2>Hello, {props.name}!</h2></div>); }// 父组件 const ParentComponent () > {const [name, setName] useState(John Doe);const handle…...
Web相机和浏览器的二维码扫描方案
Web相机和适用于浏览器的二维码扫描方案 qr-camera 在线体验 | English 功能 支持浏览器扫描二维码支持拍照支持录像功能支持二维码解析和生成 quickstart npm i qr-cameraimport {QRCamera} from qr-camera;function main(){const camera new QRCamera();document.body…...

云端部署ChatGLM-6B
大模型这里更新是挺快的,我参考的视频教程就和我这个稍微有些不一样,这距离教程发布只过去4天而已… 不过基本操作也差不多 AutoDL算力云:https://www.autodl.com/home ChatGLM3:https://github.com/THUDM/ChatGLM3/tree/main Hug…...

设计模式(3)-结构型模式
结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则…...

C/C++调试工具 - gdb详解
C/C调试工具 -gdb详解 1 简介 2 常用的命令 3 使用的条件 4 程序调试 4.1 直接运行程序 4.2 断点调试(在某一行) 4.3 断点调试(在函数入口处打断点) 5 调试core文件 5.1 生成core文件的方法 5.2 调试core文件 1 简介 GDB是Linux下非常好用且强大的调试工具。GD…...

传奇GOM引擎微端连接不上如何解决
Gom传奇引擎的微端连不上的原因可能有很多,比如网络问题、服务器配置问题、版本兼容性问题等。1.检查网络连接:首先要确保你的网络连接稳定。如果遇到网络问题,比如网络延迟过高,可能会导致你无法连接到服务器。建议使用稳定的网络…...
Easymesh介绍
1.什么是Easymesh 什么是Easymesh,这里需要介绍到有3个点,分别是WFA、MAP和Easymesh。 WFA是Wi-Fi 联盟,Wi-Fi 联盟是专门针对 Wi-Fi 主题的标准创建机构,并且制定新标准,在 Wi-Fi 基础上提供可用功能,全球成员超过 800 家(SoC、制造商和 SW 公司) MAP 是 Multi-AP Te…...

图像相似度对比方法
1.哈希方法,其中包括均值哈希、插值哈希、感知哈希方法。计算出图片的哈希值,一般使用汉明 距离计算两个图片间的差距。 2.直方图算法,其中包括灰度直方图算法,RGB直方图算法, 3.灰度图算法:MSE、SSIM、…...

C++ 配合图形库实现画线效果
#include<stdio.h> #include <conio.h> #include<math.h> #include <graphics.h> // 引用图形库头文件 #define N 12 int List[N][N];void draw() {for (int i 0; i < N; i) {int x 200 * cos(2 * 3.14 * i / N);int y 200 * sin(2 * 3.1…...
zookeeper应用之分布式屏障
分布式系统中某些节点任务当满足某个条件时才允许继续运行,如果不满足则当前节点需要等待。这个时候就需要一个屏障来阻止节点的处理。ZooKeeper Barrier是ZooKeeper提供的一种用于分布式环境中实现同步和协调的机制。具体逻辑就是: 1、检测某个barrier…...
PDBADMIN 的作用,命名,重建 以及能否DROP
Creating a pluggable database using below SQL: create pluggable database psample1 admin user psample_admin identified by "XXXXXXXXXXXXXXX roles(connect) create_file_destDGEHDB; What if user psample_admin gets dropped accidentally? Is it important?…...

华为L410上制作内网镜像模板02
原文链接:华为L410上制作离线安装软件模板02 hello,大家好啊,今天给大家带来第二篇在内网搭建Apache服务器,用于安装完内网操作系统后,在第一次开机时候,为系统安装软件的文章,今天给大家介绍在…...

美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23
美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23 2023年10月13日,美国材料与试验协会(ASTM)发布了新版玩具安全标准ASTM F963-23 根据CPSIA的规定,当ASTM将ASTM F963的拟定修订意见通知CPSC时,若CPSC认为…...

Postman模拟上传文件
如图,在F12抓到的上传文件的请求 那要在postman上模拟这种上传,怎么操作呢,如图,选中【Select File】选取文件上传即可...
【系统架构设计】架构核心知识: 1 系统工程与信息系统基础
目录 一 系统工程 二 信息系统 三 电子政务 四 企业信息化与电子商务...

加班把数据库重构完毕
加班把数据库重构完毕 本文的数据库重构是基于 clickhouse 时序非关系型的数据库。该数据库适合存储股票数据,速度快,一般查询都是 ms 级别,不需要异步查询更新界面 ui。 达到目标效果:数据表随便删除,重新拉数据以及指…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...