当前位置: 首页 > news >正文

C语言中的静态库和动态库的制作和使用

什么是库文件

单一模型

将程序中所有功能全部实现于一个单一的源文件内部。

编译时间长,不易于维护和升级,不易于协作开发。

分离模型

将程序中的不同的功能模块划分到不同的源文件中。

缩短编译时间,易于维护和升级,易于协作开发。

库文件

对多个目标文件的管理比较麻烦,可以将多个目标文件统一整理成一个库文件。

库文件可以直接在其他C语言程序中直接调用。

可以简单的把库文件理解成一种代码仓库,它提供给使用者一些可以直接拿来用的变量,函数或者类。

库文件一般指的是计算机上的一类文件,分为两种,一种叫做静态库,一种叫做动态库。

静态库

概述

静态库的本质是将多个目标文件打包成一个文件。

链接静态库就是将库中被调用的代码复制到调用模块中。

静态库的扩展名是.a,比如libxxx.a

静态库的构建

1、编辑库的实现代码和接口声明

  • 计算模块:calc.h,calc.c
  • 显示模块:show.h,show.c
  • 接口文件:math.h

2、编译成目标文件

gcc -c calc.c
gcc -c show.c

3、打包成静态库

ar -r libmath.a calc.o show.o

实战案例:构建 libmath.a 静态库

准备源文件

calc.h

  • 定义加法:int add(int a, int b);
  • 定义减法:int sub(int a, int b);
#ifndef __CALC_H_
#define __CALC_H_int add(int a, int b);
int sub(int a, int b);#endif // __CALC_H_

calc.c

  • 简单的实现加法
  • 简单的实现减法
#include "calc.h"int add(int a, int b){return a + b;
}int sub(int a, int b){return a - b;
}

show.h

#ifndef __SHOW_H_
#define __SHOW_H_void show(int a, char* op, int b, int res);#endif // __SHOW_H_

show.c

#include <stdio.h>
#include "show.h"void show(int a, char* op, int b, int res){printf("%d %s %d = %d\n", a, op, b, res);
}
编译C源文件
gcc -c calc.c
gcc -c show.c
构建静态库
ar -r libmath.a calc.o show.o
使用静态库文件

main.c

#include <stdio.h>
#include "calc.h"
#include "show.h"int main(){int a = 11;int b = 22;int res = add(a, b);show(a, "+", b, res);return 0;
}

编译并运行文件,此时把静态库文件也带上:

gcc main.c libmath.a -o main && ./main

输出结果如下:

11 + 22 = 33
使用接口文件优化

当我们的库越来越大的时候,头文件也会越来越多,这个是让用户分别引入每个头文件是不人性化的。

这个时候,我们可以给库配套一个相应的头文件,这个头文件中引入需要的所有其他头文件这个。这个与库对应的头文件就是我们这个库的接口文件。

math.h

#ifndef __MATH_H_
#define __MATH_H_#include "calc.h"
#include "show.h"#endif // __MATH_H_

main.c

#include <stdio.h>
#include "math.h"int main(){int a = 11;int b = 22;int res = add(a, b);show(a, "+", b, res);return 0;
}

动态库

概述

动态库的扩展名是.so。

动态库是被加载,调用的时候是根据内存地址去调用,而不是将代码复制到文件中。

动态库可以同时被多个进程使用。

实战案例:构建 libmath.so 动态库

准备源文件

calc.h

  • 定义加法:int add(int a, int b);
  • 定义减法:int sub(int a, int b);
#ifndef __CALC_H_
#define __CALC_H_int add(int a, int b);
int sub(int a, int b);#endif // __CALC_H_

calc.c

  • 简单的实现加法
  • 简单的实现减法
#include "calc.h"int add(int a, int b){return a + b;
}int sub(int a, int b){return a - b;
}

show.h

#ifndef __SHOW_H_
#define __SHOW_H_void show(int a, char* op, int b, int res);#endif // __SHOW_H_

show.c

#include <stdio.h>
#include "show.h"void show(int a, char* op, int b, int res){printf("%d %s %d = %d\n", a, op, b, res);
}
编译C源文件
gcc -c -fpic calc.c
gcc -c -fpic show.c
构建动态库
gcc -shared calc.o show.o -o libmath.so
使用动态库

main.c

#include <stdio.h>
#include "calc.h"
#include "show.h"int main(){int a = 11;int b = 22;int res = add(a, b);show(a, "+", b, res);return 0;
}

编译并运行文件,此时把静态库文件也带上:

# 先配置库所在的环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.# 编译执行
gcc main.c libmath.so -o main && ./main

输出结果如下:

11 + 22 = 33

相关文章:

C语言中的静态库和动态库的制作和使用

什么是库文件 单一模型 将程序中所有功能全部实现于一个单一的源文件内部。 编译时间长&#xff0c;不易于维护和升级&#xff0c;不易于协作开发。 分离模型 将程序中的不同的功能模块划分到不同的源文件中。 缩短编译时间&#xff0c;易于维护和升级&#xff0c;易于协…...

【MySQL 数据宝典】【事务锁】- 002 事务控制的演进

一、事务处理思路 1.1 排队 排队处理是事务管理最简单的方法&#xff0c;就是完全顺序执行所有事务的数据库操作&#xff0c;不需要加锁&#xff0c;简单的说就是全局排队。序列化执行所有的事务单元&#xff0c;数据库某个时刻只处理一个事务操作&#xff0c;特点是强一致性…...

如何远程操作服务器中的Python编译器并将运行结果返回到Pycharm

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…...

C++入门指南(上)

目录 ​编辑 一、祖师爷画像 二、什么是C 三、C发展史 四、C在工作领域的应用 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. 游戏开发 4. 嵌入式和物联网领域 5. 数字图像处理 6. 人工智能 7. 分布式应用 五、如何快速上手C 一、祖师爷画像 本贾尼斯特劳斯…...

Python 全栈系列244 nginx upstream 负载均衡 踩坑日记

说明 最初是因为租用算力机(Python 全栈系列242 踩坑记录:租用算力机完成任务)&#xff0c;所以想着做一个负载均衡&#xff0c;然后多开一些服务&#xff0c;把配置写在nginx里面就好了。 一开始租用了一个3080起了一个服务&#xff0c;后来觉得速度不够快&#xff0c;再起了…...

数据链路层——计算机网络学习笔记三

使用点对点信道的数据链路层 前言&#xff1a; 1.数据链路层的重要性&#xff1a;网络中的主机、路由器都必须实现数据连输层&#xff1b; 2.数据链路层中使用的信道&#xff1a; 点对点信道&#xff1a;这种信道是一对一的通信方式&#xff1b; 广播信道&#xff1a;使用一对多…...

leetcode——反转链表

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;创建三个指针n1,n2,n3&#xff0c;遍历原链表&#xff0c;通过三者之间的关系将链表反转。下面给出图示&#xff1a; 下面给出题解代码&#xff1a; typedef struct ListNode ListNode; struct List…...

类加载机制(双亲委派机制)

文章目录 JVM的作用是什么双亲委派机制加载流程 JVM的作用是什么 我们运行Java程序时&#xff0c;要安装JDK&#xff0c;JDK包含JVM&#xff0c;不同环境的JDK都是不同的。 Java 代码在编译后会形成 class 的字节码文件&#xff0c;该字节码文件通过 JVM 解释器&#xff0c;生…...

nss刷题(2)

1、[NSSCTF 2022 Spring Recruit]ezgame 打开题目是一个游戏界面 发现是有分数的&#xff0c;猜测分数达到某个之后可以获得flag&#xff0c;查看源码看一下 看到末尾显示分数超过65后显示flag 在js中找到了一个score,将他的值改为大于65的数后随意玩一次就可以得到flag同时&a…...

2024 年“泰迪杯”A 题:生产线的故障自动识别与人员配置--第四题(用遗传算法解决生产线排班问题--matlab代码)

问题背景&#xff1a; 问题四&#xff1a;根据实际情况&#xff0c;现需要扩大生产规模&#xff0c;将生产线每天的运行时间从 8 小时增加 到 24 小时不间断生产&#xff0c;考虑生产线与操作人员的搭配&#xff0c;制定最佳的操作人员排班方案&#xff0c;要求满足以下条件&am…...

资产公物仓管理系统|实现国有资产智能化管理

1、项目背景 资产公物仓管理系统&#xff08;智仓库DW-S201&#xff09;是一套成熟系统&#xff0c;依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 项目设计原则 方案对公物仓资…...

实用的 Google Chrome 命令

以下是一些实用的 Google Chrome 命令&#xff1a; chrome://version - 显示 Chrome 浏览器的详细信息&#xff0c;包括版本号、用户代理和命令行参数等。 chrome://flags - 打开 Chrome 实验性功能页面&#xff0c;可以启用或禁用各种实验性功能。请注意&#xff0c;这些功能…...

动态规划算法:⼦数组、⼦串系列(数组中连续的⼀段)

例题一 解法&#xff08;动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; i. 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b; ii. 以某个位置…...

2010年认证杯SPSSPRO杯数学建模D题(第一阶段)服务网点的分布全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 D题 服务网点的分布 原题再现&#xff1a; 服务网点、通讯基站的设置&#xff0c;都存在如何设置较少的站点&#xff0c;获得较大效益的问题。通讯基站的覆盖范围一般是圆形的&#xff0c;而消防、快餐、快递服务则受到道路情况和到达时间的限…...

docker-compose 安装ZLMediaKit,ffmpeg、VLC实现推流并播放

1、目录&#xff08;创建conf文件夹&#xff0c;777权限&#xff09; 二、docker-compose.yml version: "3.9"services:zlmediakit:image: zlmediakit/zlmediakit:mastercontainer_name: zlmediakitprivileged: true# 指定加载配置# command: /opt/media/bin/MediaS…...

|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)

文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好&#xff0c;我是BoBo仔吖&#xf…...

vue项目基于WebRTC实现一对一音视频通话

效果 前端代码 <template><div class"flex items-center flex-col text-center p-12 h-screen"><div class"relative h-full mb-4 fBox"><video id"localVideo"></video><video id"remoteVideo">…...

web 基础之 HTTP 请求

web 基础 网上冲浪 就是在互联网(internet)上获取各种信息&#xff0c;进行工作&#xff0c;或者娱乐&#xff0c;他的英文表示surfing the Internet&#xff0c;因 “surfing”d的意思是冲浪&#xff0c;即成为网上冲浪&#xff0c;这是一种形象说法&#xff0c; 也是一个非…...

嵌入式 - GPIO编程简介

An Introduction to GPIO Programming By Jeff Tranter Wednesday, June 12, 2019 编者按&#xff1a;本 2019 年博客系列是 ICS 最受欢迎的系列之一&#xff0c;现已更新&#xff08;2022 年 12 月&#xff09;&#xff0c;以确保内容仍然准确、相关和有用。 本博客是 Integr…...

8种区块链开发者必须知道的顶级编程语言!

我来问你一个问题&#xff1a;请说出一种技术&#xff0c;它以去中心化、不可篡改和透明性等核心特征席卷了全球。 这个问题的答案是&#xff0c;当然是区块链&#xff0c;它在近些年进入大家的视野并颠覆了工商业&#xff0c;没有任何其他技术能够做到这一点。 预计从2020年…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...