静态库、动态库制作

库介绍

静态库和动态库是软件开发中常用的两种库文件形式。静态库(static library)是在编译时被链接到程序中的库,它包含了一组预编译的目标代码,这些代码将直接复制到最终的可执行文件中。静态库的优点是简单易用,只需将库文件链接到程序中即可,无需额外的运行时依赖。然而静态库的缺点是会导致可执行文件的体积增大,并且在多个程序中使用相同的静态库会造成重复代码。

动态库(dynamic library)是在程序运行时被加载到内存中并链接的库,它包含了一组共享的目标代码,可以被多个程序共享使用。与静态库相比,动态库的主要优点是能够在运行时动态加载和卸载,从而实现代码的共享和更新。此外,动态库还可减少可执行文件的体积,因为程序只需要引用动态库的链接信息而非赋值其代码。但是,使用动态库需要在系统中存在对应的库文件,并且程序在运行时依赖于这些库文件的存在。

在实际的开发中,选择使用静态库还是动态库取决于具体的需求和项目要求。如果程序对文件体积敏感,或需要独立开发,则可以选择静态库。如果需要灵活的共享和更新代码,或者需要在运行时插拔功能模块,则可以选择动态库。

库原理

静态库

 动态库

静态库制作

1、先创建三个文件,分别是含有main函数的文件、头文件和源文件

code.c

#include<stdio.h>
#include"temp.h"
int main()
printf("%d\n",my_add(100,200));
printf("%d\n",my_sub(100,200));
printf("%d\n",my_mul(100,200));
printf("%d\n",my_div(100,200));
return 0;
}

static.c

#include"temp.h"
int my_add(int a,int b){
return a+b;}
int my_sub(int a,int b){
return a-b;}
int my_mul(int a,int b){
return a*b;}
int my_div(int a,int b){
return a/b;}

temp.h

extern int my_add(int a,int b);
extern int my_sub(int a,int b);
extern int my_mul(int a,int b);
extern int my_div(int a,int b);

2、

#将源文件static.c制作成 二进制文件

gcc -c static.c -o static.o

#将二进制文件 生成静态库

ar rc libstatic.a static.o

"ar rc"简介

“ar rc” 是一个用于创建静态库的命令行工具操作。

“ar” 是 Archive(归档)的缩写,它用于创建、管理和操作库文件。“rc” 是 ar 命令的选项之一,具有以下含义:

  • “r” 表示将文件插入到库中。当使用 “ar rc” 命令时,它会将指定的文件插入到库中,如果库已存在,则会替换库中已有的同名文件。
  • “c” 表示创建库。如果库文件不存在,则会创建一个新的库文件。

2.1、制作demo

 

操作demo

放入自定义的目录(注意头文件也需要注明,-I是头文件路径,-L是库路径)

 

动态库制作

gcc -shared dynamic.c -o libdynamic.so

制作demo

操作demo

(注意:动态库还需要设置变量,指定动态库的路径,这里为当前路径)

放入自定义的目录(也需要设置环境变量)

注意:这里是在test目录下 ,一个静态库,一个动态库,默认使用动态库链接

验证(这里我把库名设为一样的,都是-ltemp)

1、

 2、

此处把生成的可执行文件名更改,防止命名冲突 ,这里改为1和2,静态库使用加-static

3、

从这可以看出,静态库体积很大。

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

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

相关文章

搜狗的workflow的简单使用

workflow是一个网络库&#xff0c;是一个基于C在在线服务引擎 GitHub官网 运行hello world 1,创建一个server&#xff0c;构造函数入参传入一个入参是task的lamda函数&#xff0c;函数的内容会拿到response&#xff0c;并且可以在response中写body 2、server启动&#xff0c;…

普中51单片机学习(十一)

独立按键 独立按键原理 按键在闭合和断开时触电存在抖动现象 硬件消抖电路如下 实验代码 #include "reg52.h" typedef unsigned char u8; typedef unsigned int u16;void delay(u16 i) {while(i--); } sbit ledP2^0; sbit k1P3^1;void keypro() {if(k10){delay(1…

Bert基础(一)--transformer概览

1、简介 当下最先进的深度学习架构之一&#xff0c;Transformer被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network, RNN)和长短期记忆(long short-term memory, LSTM)网络&#xff0c;并且以它为基础衍生出了诸如BERT、GPT-3、T5等…

化学空间可视化(chemical space visualization)开源软件ChemPlot的安装及使用

文章目录 前言一、ChemPlot是什么&#xff1f;二、conda环境安装ChemPlot1. 创建conda环境2. 安装chemplot及需要的包3. 检验安装 三、使用步骤1. 化合物数据库可视化使用方法BBBP数据库的t-SNE降维后可视化&#xff1a;BBBP数据库的PCA降维后可视化&#xff1a;BBBP数据库的UM…

小米空气净化器2s使用体验

这个产品最早上市是2017年&#xff0c;我买回来实际上只用了1年就弃用了&#xff0c;性能不行&#xff0c;使用体验也不好。 打算买新的空气净化器&#xff0c;抽空吐槽一下。 这个净化器发售价是899&#xff0c;在当时来说算中下水平的&#xff0c;小米的&#xff0c;有米家…

第一件事 什么是 Java 虚拟机 (JVM)

1、什么是虚拟机&#xff1f; - 这个其实是一个挺逗的事情&#xff0c;说白了&#xff0c;就是基于某个硬件架构&#xff0c;在这个硬件部署了一个操作系统&#xff0c;再构架一层虚拟的操作系统&#xff0c;这个新构架的操作系统就是虚拟机。 不知道的兄弟姐妹们&#xff0c;…

Unity3d Mesh篇(一)— 创建简单三角面

文章目录 前言一、Mesh组成二、使用步骤三、效果四、总结 前言 Mesh&#xff08;网格&#xff09;是一种常用的3D图形表示方法&#xff0c;它由顶点&#xff0c;法线&#xff0c;UV 坐标&#xff0c;和三角形等组成。您可以使用 Mesh 类的方法来创建或修改网格&#xff0c;也可…

stm32 DCMI的知识点

1.DCMI的简介 DCMI全称Digital camera interface&#xff08;数字摄像头接口&#xff09;&#xff0c;是一种可以采集摄像头数据的一种接口。此接口适用于黑白摄像头、X24 和 X5 摄像头&#xff0c;并可以假定所有预处理&#xff08;如调整大小&#xff09;都可以在该摄像头模…

力扣 188. 买卖股票的最佳时机 IV

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/ C题解&#xff1a;动态规划 思路同力扣 123. 买卖股票的最佳时机 III-CSDN博客&#xff0c;只是把最高2次换成k次。如果思路不清晰&#xff0c;可以将k从0写到4等找找规律…

vue 导出,下载错误提示、blob与json数据转换

一、成功/失败 - 页面展示 失败 成功 二、成功/失败 - 接口请求/响应展示成功 2. 失败 三、解决 // 导出列表exportReceivedExcel() {if (this.tableCheckedValue) {this.form.ids this.tableCheckedValue.map(v > {return v.id || null})}this.loadingReceivedExcel …

智能未来之路:《NIST AI RMF 1.0》与负责任的AI发展

引言 在当今快速发展的人工智能领域&#xff0c;美国国家标准与技术研究院&#xff08;NIST&#xff09;发布的《NIST AI RMF 1.0》框架是一个标志性的里程碑。这一框架不仅为AI技术的负责任和可信赖使用提供了重要指导&#xff0c;而且对于推动可持续的AI发展具有深远影响。本…

Vue-route核心知识整理

目录 1 相关理解 1.1 对 vue-router 的理解 1.2 对 SPA 应用的理解 1.3 对路由的理解 1.3.1 什么是路由&#xff1f; 1.3.2 路由的分类 2 几个注意点 3 路由的基本使用 4 嵌套 (多级) 路由 5 路由传参 5.1 query 方式传参 5.1.1 跳转路由并携带query参数&#xff0…

Swift Combine 使用 print 操作符调试管道 从入门到精通二十四

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)

文章目录 2.1 安装和配置 Solidity2.1.1 基础知识解析安装 Solidity 编译器配置开发环境熟悉命令行工具 2.1.2 重点案例&#xff1a;配置本地开发环境案例 Demo&#xff1a;配置本地 Solidity 环境案例代码&#xff1a;HelloWorld.sol 2.1.3 拓展案例 1&#xff1a;设置 Remix …

STM32入门教程:新建工程

本博文是基于建立好STM32的keil5软件后建立工程&#xff0c;如果还没下载软件建议先下载好该软件&#xff0c;在 B站江科大32教学有&#xff0c;并把相关文件下好。 STM32的开发方式有&#xff1a;基于寄存器的方式&#xff0c;基于标准库也就是库函数的方式&#xff0c;基于…

中期国际2.19黄金市场分析:美国通胀数据火热,黄金面临高利率削弱的挑战

周一(2月19日)亚市&#xff0c;现货黄金震荡走高&#xff0c;目前交投于2018.32美元/盎司左右&#xff0c;涨幅约为0.25%。上周五金价收涨0.46%&#xff0c;报价2013.46美元/盎司&#xff0c;虽然黄金周五略有上涨&#xff0c;但由于通胀数据炽热&#xff0c;美联储提前降息的可…

Linux 驱动开发基础知识——LED 模板驱动程序的改造:设备树(十一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统(附项目源码)

配置连接点 材质 连接器控制 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Connector : MonoBehaviour {[Header("连接器位置")]public ConnectorPosition connectorPosition;[Header("连接器所属建筑类型&qu…

静电ESD整改实践:从基础到高级的应对策略?|深圳比创达电子EMC

在电子制造和数据中心等高科技领域&#xff0c;静电放电&#xff08;Electrostatic Discharge&#xff0c;简称ESD&#xff09;是一个长期以来备受关注的问题。静电不仅可能损坏敏感的电子设备&#xff0c;还可能导致数据损失甚至安全事故。随着科技的不断发展&#xff0c;对ES…

大数据 - Spark系列《七》- 分区器详解

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…