C语言:静态库和动态(共享)库

相关阅读

C语言icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482


        在软件开发中,库(Library)是一个至关重要的概念。它们是由函数和数据的集合构成,用于实现特定的功能,供其他程序调用和使用。根据它们的链接方式和使用时机,库可以分为两类:静态库(Static Library)和动态(共享)库(Dynamic or Shared Library)。本文将深入探讨这两种库的特点、创建和使用方法,以及它们各自的优缺点。

静态库

        静态库在编译时被包含到可执行文件中。它们通常有以下特点:

        1、文件拓展名:在windows操作系统上是.lib,在Unix-like操作系统(如Linux)上是.a。

        2、链接时机:静态库在编译链接阶段被包含到可执行文件中。

        3、独立性:生成的可执行文件独立于库文件运行,不依赖外部库。

创建静态库

        以C语言为例,创建一个简单的数学库:

         1、编写源代码:

// mathlib.c
#include "mathlib.h"int add(int a, int b) {return a + b;
}int multiply(int a, int b) {return a * b;
}

        对应的头文件: 

// mathlib.h
#ifndef MATHLIB_H
#define MATHLIB_Hint add(int a, int b);
int multiply(int a, int b);#endif // MATHLIB_H

        2、编译源文件为目标文件:

gcc -c mathlib.c -o mathlib.o

        3、创建静态库:

ar rcs libmathlib.a mathlib.o

使用静态库

1、编写使用静态库的程序:

// main.c
#include <stdio.h>
#include "mathlib.h"int main() {int sum = add(3, 4);int product = multiply(3, 4);printf("Sum: %d\n", sum);printf("Product: %d\n", product);return 0;
}

2、编译并链接静态库:

gcc main.c -L. -lmathlib -o main

3、运行程序:

./main
Sum: 7
Product: 12

动态(共享)库

        动态库在程序运行时被加载。它们通常有以下特点:

        1、文件拓展名:在windows操作系统上是.dll,在Unix-like操作系统(如Linux)上是.so(Shared Object)。

        2、链接时机:动态库在程序运行时被加载,使用动态链接。

        3、共享性:多个程序可以共享同一个动态库文件,从而节省内存。

创建动态库

        仍以C语言为例,创建一个动态数学库:

        1、编写源代码(与静态库相同):

// mathlib.c
#include "mathlib.h"int add(int a, int b) {return a + b;
}int multiply(int a, int b) {return a * b;
}

        对应的头文件: 

// mathlib.h
#ifndef MATHLIB_H
#define MATHLIB_Hint add(int a, int b);
int multiply(int a, int b);#endif // MATHLIB_H

        2、编译源文件为目标文件,并生成动态库:

gcc -fPIC -c mathlib.c -o mathlib.o
gcc -shared -o libmathlib.so mathlib.o

使用动态库

        1、编写使用动态库的程序(与静态库相同):

// main.c
#include <stdio.h>
#include "mathlib.h"int main() {int sum = add(3, 4);int product = multiply(3, 4);printf("Sum: %d\n", sum);printf("Product: %d\n", product);return 0;
}

        2、编译并链接动态库: 

gcc main.c -L. -lmathlib -o main

        3、设置库路径并运行程序:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main
Sum: 7
Product: 12

静态库与动态库的比较

特点静态库动态库
链接时机编译时包含到可执行文件中运行时加载
文件扩展名

.lib(Windows)   .a(Linux)

.dll(Windows)   .so(Linux)
独立性可执行文件独立,不依赖外部库可执行文件依赖于外部库
内存使用每个程序各自包含一份库代码,占用更多内存多个程序共享同一个库文件,占用更少内存
更新和维护更新库需要重新编译和链接所有程序更新库时,只需替换库文件

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

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

相关文章

使用Vuepress搭建个人网站

网站地址&#xff1a;bloggo.chat

vue中怎么改变状态值?

在Vue中&#xff0c;状态值通常指的是组件的data函数返回的对象中的属性&#xff0c;或者是Vuex状态管理库中的状态。以下是在Vue中改变状态值的几种常见方法&#xff1a; 1. 直接在组件内部改变状态值 在Vue组件中&#xff0c;你可以直接在methods中改变data函数返回的对象中…

MySQL学习作业二

作业描述 SQL语言 建库&#xff0c;使用库 mysql> create database mydb8_worker;#新建库mysql> use mydb8_worker; 建表&#xff0c;查看表 #建表 mysql> create table t_worker(department_id int(11) not null comment部门号,worker_id int(11) primary key no…

无人机足球比赛技术详解

一、无人机类型参数 在无人机比赛中&#xff0c;不同类型的无人机因其独特的参数配置而表现出不同的性能。这些参数包括但不限于&#xff1a; 1. 机体尺寸&#xff1a;小型无人机适合室内或狭窄空间比赛&#xff0c;而大型无人机则更适用于室外大场地赛事。 2. 动力系统&…

动态路由协议 —— EIGRP 与 OSPF 的区别

EIGRP&#xff08;增强内部网关路由协议&#xff09;和 OSPF&#xff08;开放式最短路径优先&#xff09;是两种最常见的动态路由协议&#xff0c;主要是用来指定路由器或交换机之间如何通信。将其应用于不同的情况下&#xff0c;可提高速率、延迟等方面的性能。那么它们之间到…

装修前需要提前准备啥

雅静说装修前自备15材料,才不会手慌脚乱      省的师父用的时候我们还得着急到处跑,关键质量和价格还没得选      1,保护膜,一开工就把入户门,电梯口的墙都包好      不然装完就像这样,磕碰的到处是口子      2,钥匙密码盒,有时候上班我们不在,师父或送材料的一…

IO多路复用-select的使用详解【C语言】

1.多进程/线程并发和IO多路复用的对比 IO多路转接也称为IO多路复用&#xff0c;它是一种网络通信的手段&#xff08;机制&#xff09;&#xff0c;通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的&#xff0c;一旦检测到有文件描述符就绪&#xff08; 可以读数据…

【数据结构进阶】二叉搜索树

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C || 数据结构 目录 &#x1f308;前言&#x1f525;二叉搜索树&#x1f525; 二叉搜索树的实现Insert&#xff08;插入&#xff09;find&#xff08;查找&#xff09;erase(删除)destro…

firefly rk3288 ubuntu23.10 网卡名为end0 改为eth0

1、内核源码修改u-boot/include/env_default.h文件第32行的bootargs参数&#xff0c;修改后&#xff1a; "bootargs net.ifrenames0 " CONFIG_BOOTARGS "\0"2、修改rootfs里的lib/systemd/network/99-default.link文件&#xff1a; [M…

分布式锁、Lua脚本、redisson、运行lua脚本优化代码

20240721 一、分布式锁1. 什么是分布式锁2. 分布式锁的实现3. 基于redis的分布式锁4 总结 二、对于lua脚本可以保证事务&#xff0c;要么成功要么失败。1. 在redis中调用lua脚本 三、Redisson1 步骤2. Redisson的总结3. 几种分布式锁的区别 三、优化我们的秒杀1. 我们在创建优惠…

Docker安装笔记

1. Mac安装Docker 1.1 Docker安装包下载 1.1.1 阿里云 对于10.10.3以下的用户 推荐使用 对于10.10.3以上的用户 推荐使用 1.1.2 官网下载 系统和芯片选择适合自己的安装包 1.2 镜像加速 【推荐】阿里镜像 登陆后&#xff0c;左侧菜单选中镜像加速器就可以看到你的专属地…

windows和linux的等保加固测评的经验分享

一头等保加固测评的牛马&#xff0c;需要能做到一下午测评n个服务器 接下来就讲讲如何当一头xxxxxxxxx》严肃的等保测评加固的经验分享&#xff08; 一、window等保 首先你要自己按着教程在虚拟机做过一遍&#xff08;win2012和win2008都做过一遍&#xff0c;大概windows的…

pico+unity3d 射线交互教程

前期配置&#xff1a;环境配置参考教程一&#xff0c;手部模型参考教程二&#xff0c;场景基于上一篇搭建。 最终效果&#xff1a;手部射线&#xff08;初始不可见&#xff09;对准 UI 显示&#xff0c;按下手柄 Trigger 键与可交互 UI&#xff08;如 Button、Toggle、Slider …

论文解读 | ICML2024:突破Transformer上下文学习中的瓶颈

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 作者简介 付靖文&#xff0c;西安交通大学博士生 简介 上下文学习&#xff0c;即从上下文示例中学习&#xff0c;是Transformer一项令人印象深刻的能力。然而&#xff0c;由于学习瓶颈的出现——在训练过程中模…

移动UI:任务中心的作用,该如何设计更合理?

任务中心是移动应用中用于展示和管理用户待办任务、提醒事项、用户福利、打卡签到等内容的功能模块。合理设计任务中心可以提升用户体验和工作效率。 以下是一些设计任务中心的合理建议&#xff1a; 1. 易于查看和管理&#xff1a; 任务中心的设计应该使用户能够快速、直观地…

C# 实现跨进程条件变量

C# 进程通信系列 第一章 共享内存 第二章 条件变量&#xff08;本章&#xff09; 第三章 消息队列 文章目录 C# 进程通信系列前言一、关键实现1、用到的主要对象2、初始化区分创建和打开3、变量放到共享内存4、等待和释放逻辑 二、完整代码三、使用示例1、同步控制2、跨进程控…

202496读书笔记|《飞花令·菊(中国文化·古典诗词品鉴)》——荷尽已无擎雨盖,菊残犹有傲霜枝

202496读书笔记|《飞花令菊&#xff08;中国文化古典诗词品鉴&#xff09;》——荷尽已无擎雨盖&#xff0c;菊残犹有傲霜枝 《飞花令菊&#xff08;中国文化古典诗词品鉴&#xff09;》素心落雪 编著。飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”&#xff0c…

KubeSphere核心实战_kubesphere全功能安装_启用kubesphere的热插拔插件---分布式云原生部署架构搭建037

然后我们开始安装kubesphere,首先进入官网点击kubernetes安装 可以看到对应的,条件说kubernetes要在1.20.x以上,我们的是 1.20.9,然后cpu硬件满足,然后,默认存储类型,上一节我们安装好了 然后就可以开始,去下载两个配置文件可以看到上面的两个配置文件 这两个文件,上面是直接…

跨域问题:预检请求

解决跨域问题之预检请求 预检请求&#xff08;Preflight Request&#xff09;是跨域资源共享&#xff08;CORS&#xff09;中用于安全检查的一种机制。 它是由浏览器自动发起的一个OPTIONS请求&#xff0c;目的是在实际跨域请求之前&#xff0c;询问服务器是否允许这次跨域操…

学习TS -类型

let a:number10;//数值型 let b:string"zhaoya";//字符串型 let c:booleantrue;//布尔类型 let d:10;//字面量 let e:any10;//任意类型&#xff0c;可以给别人赋值&#xff0c;而且不会提示报错 let f:unknown50;//未知类型&#xff0c;他给别人赋值&#xff0c;赋值…