Linux——动静态库的制作和使用(实操+代码+原理介绍)

news2024/10/5 13:25:25

0

动静态库的制作和使用

  • 1️⃣.动静态库介绍
    • 🏀静态库
    • ⚽️动态库
    • 🏈区别
    • 🏐使用动态库的优点包括:
    • 🏉 使用静态库的优点包括:
  • 2️⃣静态库的制作
    • 🍊Q:库文件能不能有main()函数?
    • 🍋准备好库函数.h和.c文件
    • 🍌 配置makefile
    • 🧏🏿‍♂️运行测试
  • 3️⃣ 4️⃣ 5️⃣ 6️⃣

1️⃣.动静态库介绍

🍏动态库(Dynamic Library)和静态库(Static Library)是在软件开发中常用的两种库文件形式。

🏀静态库

静态库是一组已编译的目标文件的集合,它们被打包成一个单独的文件。当程序链接时,编译器会将静态库的目标文件直接嵌入到最终的可执行文件中。静态库在编译时被完整地复制到可执行文件中,使得可执行文件成为一个独立、自包含的实体。这意味着程序运行时不需要额外的库文件支持,所有所需的代码都已嵌入到可执行文件中。静态库的扩展名通常是 .a(对于UNIX/Linux)或 .lib(对于Windows)。

⚽️动态库

相比之下,动态库是一组已编译的目标文件的集合,它们在运行时由操作系统动态加载到内存中。当程序链接时,编译器只会在可执行文件中包含动态库的引用,而不会将实际的代码嵌入到可执行文件中。程序在运行时,通过动态链接器(如 Windows 的 DLL 动态链接库或 UNIX/Linux 的共享对象文件 .so)将动态库加载到内存,并与可执行文件进行连接。动态库的扩展名通常是 .so(对于UNIX/Linux)或 .dll(对于Windows)。

🏈区别

  • 静态库的代码在编译时被复制到可执行文件中,使得可执行文件自包含,无需外部依赖。
  • 动态库的代码在运行时动态加载到内存中,多个程序可以共享同一个动态库,减少内存占用和可执行文件的大小。

🏐使用动态库的优点包括:

  1. 节省内存和磁盘空间,多个程序可以共享同一个动态库。
  2. 允许在运行时更新和升级库,而无需重新编译整个程序。
  3. 支持动态链接,使得程序更灵活、易于维护和分发。

🏉 使用静态库的优点包括:

  1. 代码的嵌入性,可执行文件自包含,无需外部依赖。
  2. 可以确保程序与特定版本的库文件完全兼容。
  3. 选择使用动态库还是静态库,通常取决于项目的需求、开发环境和目标平台等因素。在实际开发中,通常会根据实际情况进行权衡和选择。

2️⃣静态库的制作

🍊Q:库文件能不能有main()函数?

		A:不能 ,制作的库函数是给别人使用的,两个main函数会引起冲突! 

🍋准备好库函数.h和.c文件

这里我以static.c static.h命名 写了个打印函数
在这里插入图片描述

  • 🙋🏿‍♀️ static.c
 #include"static.h"
    void _Printf(int i)                                                                                                                                                                    
    {
      while(i>0)
      {
     printf("这是一个静态库\n");
      i--;
      }
    }

  • 🙋🏿static.h
 #pragma once 
    #include <stdio.h>
    void _Printf(int i); 

然后在test.c中包含头文件 static.h 这里跟我们平时在VS下写代码 声明和定义分离是一样的道理

  • 🙋🏿‍♂️test.c
  #include"static.h"
    int main()
    {
     _Printf(10) ;
     return 0;                                                                                                                                                                             
   }
    
~

做好这几部工作之后就到重头戏啦~

🍌 配置makefile

先看配置:
在这里插入图片描述

  • 🧏🏿‍♀️ 代码
test: test.c libstatic.a
      gcc -o $@ $^ -std=c99
    
    libstatic.a: static.o
      ar rcs $@ $^
    
   static.o: static.c static.h
      gcc -c -o $@ $< -std=c99
    
   .PHONY: clean
   clean:
     rm -f test libstatic.a static.o                                                                                                                                                      
   

  • 🧏🏿 代码介绍
    == 这个 makefile 中添加了三个规则== :
  1. libstatic.a 规则:用于生成静态库文件 libstatic.a,它依赖于 static.o 目标文件。
  2. static.o 规则:用于编译 static.c 生成目标文件 static.o。
  3. clean 规则:用于清理生成的文件。
    == 总结== :在这个 makefile 中,我们指定了要生成的可执行文件为 test,它依赖于 test.c 和 libstatic.a。同时,我们定义了生成静态库文件 libstatic.a 的规则,并指定它依赖于 static.o 目标文件。最后,我们定义了清理文件的规则。

通过修改 makefile 并重新运行 make 命令,你应该能够成功编译并链接包含自定义静态库的程序。

🧏🏿‍♂️运行测试

2

成功~ 这就成功

🤦🏿‍♀️ 🤦🏿

🍉 🍇 🍓 🍈 🍒 🍑 🥭 🍍

3️⃣ 4️⃣ 5️⃣ 6️⃣

未完待续~

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

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

相关文章

imazing是什么软件?2023年imazing官网中文版下载

最近很小伙们&#xff0c;咨询兔八哥&#xff0c;imazing是什么软件&#xff1f;&#xff0c;今天兔八哥爱分享整理一下imazing到底是什么软件&#xff1f;好用吗&#xff1f; imazing是一款iOS设备管理软件,借助 iMazing 的独有 iOS 备份技术&#xff08;无线、隐私和自动&am…

地震正演基础知识

文章目录 地震正演1. 地震正演基础知识1.1 地震波1.2 波动方程1.3 有限差分方法1.4 边界条件1.5 记录数据 2. 公式2.1 泰勒级数回顾2.2 二维声波方程&#xff08;连续的偏微分方程&#xff09;2.2.1 二维声波方程&#xff08;连续的偏微分方程&#xff09;2.2.2 离散化二维声波…

【C++】vector模拟实现

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Netty 为什么有如此高的性能?

文章首发地址 Netty高性能的三个主题 I/O传输模型&#xff1a;用什么样的通道将数据发送给对方&#xff0c;是BIO、NIO还是AIO&#xff0c;I/O传输模型在很大程度上决定了框架的性能。数据协议&#xff1a;采用什么样的通信协议&#xff0c;是HTTP还是内部私有协议。协议的选…

1767_Perl中的全词匹配

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) 当我在上一家公司工作的时候遇到过一个问题&#xff0c;为了解决软件接口的冲突我们需要把一个软件工程中的所有变量全都修改加一个前缀。我觉得用Perl处理是一个很好的注意&…

数据库作业3

1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 4.从student表中查询计算机系和英语系的学生的信息 5.从student表…

pytest 通过conftest.py获取测试所有执行case断言失败的结果

conftest.py import pytest from datetime import datetimedef pytest_exception_interact(node, call, report):if report.failed:with open("error.log", "a", encoding"utf-8") as f:test_case f"测试文件&#xff1a;{node.nodeid} |…

备战CAIP——PTA甲级刷题

目录 引入2023年 真题1001 AB Format (20 分) 小数字相加再格式化输出1002 AB for Polynomials (25 分) 多项式相加1003 Emergency 救援最短路径和最大救援部队 引入 2023睿抗 RoboCom机器人开发者大赛CAIP编程设计赛道编程技能赛 考察知识点 https://mp.weixin.qq.com/s/lXp5…

靶机渗透之SICKOS: 1.1(解法2)

SICKOS: 1.1 靶机渗透测试是否存在shellshock构造payload获取bash权限切换shell构造pythonpayload&#xff0c;放置到py定时任务中开始监听py文件 靶机渗透 sudo nikto -h 192.168.133.139 -useproxy http://192.168.133.139:3128 - Nikto v2.5.0 ---------------------------…

Python应用实例(一)外星人入侵(八)

外星人入侵&#xff08;八&#xff09; 1.添加Play按钮1.1 创建Button类1.2 在屏幕上绘制按钮1.3 开始游戏1.4 重置游戏1.5 将play按钮切换到非活动状态1.6 隐藏鼠标光标 我们添加一个Play按钮&#xff0c;用于根据需要启动游戏以及在游戏结束后重启游戏&#xff0c;还会修改这…

FreeRTOS实时操作系统(十五)Tickless低功耗模式

系列文章 FreeRTOS实时操作系统&#xff08;一&#xff09;RTOS的基本概念 FreeRTOS实时操作系统&#xff08;二&#xff09;任务创建与任务删除&#xff08;HAL库&#xff09; FreeRTOS实时操作系统&#xff08;三&#xff09;任务挂起与恢复 FreeRTOS实时操作系统&#x…

线程栈溢出异常,程序崩溃在汇编代码test dword ptr [eax],eax上的问题排查

目录 1、问题描述 2、使用Windbg静态分析dump文件 3、将Windbg附加到进程上进行动态调试 4、使用Visual Studio进行Debug调试 4.1、使用if条件断点和汇编代码单步调试 4.2、分析消息响应函数入口处为什么会产生崩溃 4.3、解决办法 5、线程栈溢出的相关细节点说明 6、引…

JS-24 async异步函数、 await关键字;异步函数的执行流程;进程和线程;浏览器的事件循环;宏任务和微任务;Promise面试题

目录 1_异步函数1.1_async1.2_异步函数的执行流程2_await关键字 2_浏览器进程、线程2.1_进程和线程2.2_操作系统的工作方式2.3_浏览器中的JavaScript线程2.4_浏览器的事件循环2.3_宏任务和微任务2.4_Promise面试题题一题二 1_异步函数 1.1_async async是asynchronous单词的缩…

大模型基础:理论与技术的演进概述

大模型基础&#xff1a;理论与技术的演进概述 人工智能发展历程 人工智能发展历程可以概括为以下几个主要阶段: 起源阶段(1956-1980年代)&#xff0c;这一时期被称为人工智能的“黄金时代”, 达特茅斯会议首次提出人工智能概念, 开发出传统人工智能系统, 如ELIZA、深蓝等。知…

【InsCode Stable Diffusion 美图活动一期】生成着玩

此为内容创作模板&#xff0c;请按照格式补充内容&#xff0c;在发布之前请将不必要的内容删除 一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; 三、图片生成提示词与反向…

C++ | 多态

目录 前言 一、多态的概念 二、多态的定义与使用 1、多态的构成条件 2、虚函数 3、虚函数的重写&#xff08;覆盖&#xff09; 4、虚函数重写的两个例外 &#xff08;1&#xff09;协变 &#xff08;2&#xff09;析构函数的重写 5、子类的指针或者引用调用 6、C11的…

unity对象池系统

当游戏场景中出现大量的可重复利用的物体时&#xff0c;通过Destory来销毁再创建会触发不必要的GC回收机制&#xff0c;浪费性能&#xff0c;我们可以利用unity自带的对象池系统&#xff0c;从而节约性能来得到同样的效果。 为了使用这个对象池系统&#xff0c;我写了一个瞬间产…

element-plus 报错 ResizeObserver loop limit exceeded 解决

使用Element-plus&#xff0c;页面重置大小时&#xff0c;出现如下报错&#xff1a; Uncaught runtime errors: ERROR ResizeObserver loop limit exceeded at handleError (webpack-internal:///./node_modules/webpack-dev-server/client/overlay.js:252:58) at ev…

DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries

DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries 目的 本文提出了一个 仅使用 2D 信息的&#xff0c;3D 目标检测网络&#xff0c;并且比依赖与 密集的深度预测 或者 3D 重建的过程。该网络使用了 和 DETR 相似的 trasformer decoder &#xff0c;…

SpringBoot中集成jasypt-spring-boot实现配置文件数据加密脱敏

场景 经常会遇到这样一种情况&#xff1a;项目的配置文件中总有一些敏感信息&#xff0c;比如数据源的url、用户名、 密码....这些信息一旦被暴露那么整个数据库都将会被泄漏&#xff0c;那么如何将这些配置隐藏呢。 除了使用手动将加密之后的配置写入到配置文件中&#xff…