静态库为什么需要 头文件?编译的时候会编译引用的动/静态库吗?动静态库使用及区别

news/2024/9/18 14:37:03/ 标签: 软件构建

1、‌静态库‌在编译时直接整合到目标程序中,这意味着静态库中的代码会被完整地复制到最终的可执行文件中。因此,使用静态库编译的程序不依赖于外部库文件,可以在没有安装这些库的机器上独立运行‌。既然如此,为什么还需要头文件?

=》因为:

‌静态库需要头文件的原因是因为:头文件提供了库中函数的声明,允许开发者在其他代码文件中调用这些函数,而无需关注函数实现的细节。

静态库(如Windows下的.lib文件或Linux下的.a文件)是编译后的二进制文件,它们包含了库函数的实际实现代码。然而,当其他开发者想要使用这些库函数时,他们需要知道这些函数的接口信息,包括函数名、参数类型、返回值类型等,以便正确地调用这些函数。这些接口信息就是通过头文件(.h文件)提供的。头文件包含了函数的声明,但不包含函数的实现代码,它主要起到描述性作用,使得多个代码文件可以共享全局变量和函数声明,避免定义冲突,并提高代码的模块化和可维护性‌12。

简而言之,如果没有头文件提供函数声明,其他开发者将无法正确地调用静态库中的函数,因为他们不知道如何正确地传递参数或调用这些函数。因此,为了使静态库能够被广泛使用和集成到各种项目中,提供头文件是必要的步骤之一‌。

2、

我们把公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序(exe)运行时将不再需要该静态库。(如果exe引用的只有静态库,可以直接将exe拷贝给客户使用。)

动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才和可执行程序一起被载入内存,因此在可执行程序(exe)运行时还需要动态库同时存在。(如果exe引用的有动态库,将exe拷贝给客户使用的时候,必须要给动态库一起拷贝过去。不然exe无法正常打开使用)

3、使用与区别

静态库使用:头文件放到一个名为include的目录下,将生成的静态库文件放到一个lib目录下,然后将这2个目录都放到一个文件夹下,此时就可以将“这个文件夹”给别人使用了;

动态库使用:头文件放到一个名为include的目录下,将生成的动态库文件放到一个dll目录下,然后还有一个动态库的导入库lib文件,放到lib目录下,将这3个目录都放到一个文件夹下,此时就可以将“这个文件夹”给别人使用了;

这里可能有个疑问,动态库怎么还有一个DynamicLibrary.lib文件?即无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢?其实,两个是完全不一样的东西。

  StaticLibrary.lib的大小为190KB,DynamicLibrary.lib的大小为3KB,静态库对应的lib文件叫静态库,动态库对应的lib文件叫【导入库】。实际上静态库本身就包含了实际执行代码符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。


http://www.ppmy.cn/news/1520163.html

相关文章

【QNX+Android虚拟化方案】104 - MDIO Clause 22、Clause 45 条款介绍

【QNX+Android虚拟化方案】104 - MDIO Clause 22、Clause 45 条款介绍 1. Clause 22 条款通信协议2. Clause 45 条款通信协议3. 通过 Clause 22 访问 Clause 45 的寄存器3.1 读操作时序3.2 写操作时序基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播…

单片机原理图与PCB设计心得体会

在电子技术的学习和实践中,单片机原理图与 PCB 设计是至关重要的环节。通过参与相关项目的设计和制作,我深刻体会到了这两个环节的复杂性和挑战性,同时也收获了许多宝贵的经验和知识。本文将详细介绍我在单片机原理图与 PCB 设计过程中的心得…

精准设计与高效开发:用六西格玛设计DFSS实现新能源汽车开发突破

快速变化的市场需求和激烈的竞争迫使制造企业不得不持续创新和优化产品开发流程。如何在保证产品质量的前提下,加快产品开发周期,成为许多企业亟待解决的问题。六西格玛中的DFSS(Design for Six Sigma)模型提供了一种系统的方法&a…

视频提取字幕的软件有哪些?高效转录用这些

探索视频的奥秘,从字幕开始!你是否曾被繁复的字幕处理困扰,渴望有一款简单好用的在线免费软件来轻松解锁字幕提取? 告别手动输入的烦恼,我们为你精选了6款视频字幕提取在线免费软件,它们不仅能一键转录&am…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用,流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量,Kubernetes 提供了多种解决方案,其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

QT教程-十六,QT中如何解析JSON

一,对json的初步认识 (这里我们主要说明最常用的,以一个宏观的概念来说一下),json是一种数据格式,作用就是便于传递信息,我们可以按其结构和对应关系,拿到我们想要的数据。其主要结构…

FFmpeg源码:append_packet_chunked、av_get_packet函数分析

AVPacket结构体和其相关的函数分析: FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介 FFmpeg源码:av_init_packet、get_packet_defaults、av_packet_alloc函数分析 FFmpeg源码:av_packet_free_side_data、av_packet_unref、…

【LeetCode】温度转换 最小偶倍数 二叉树判断根节点

温度转换题目: 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度,以 摄氏度(Celsius)为单位。 你需要将摄氏度转换为 开氏度(Kelvin)和 华氏度(Fahrenheit)&#xff0c…

Spring Cloud全解析:网关之GateWay简介

GateWay简介 由于zuul升级为zuul2时,netflix公司内部出现了分歧,所以springcloud自己研发了一套网关gateway,提供一种简单有效的方式来对API进行路由,以及提供一些强大的过滤器功能,如:熔断、限流、重试等…

从零开始实现一个简单的 Git 操作实例

本文通过创建一个简化版的版本控制系统,展示 Git 的核心操作,如初始化仓库、提交更改、查看历史记录等。为了更好地理解这些操作,我们会结合图示来说明。 1. 初始化仓库 在 Git 中,初始化仓库的命令是 git init。这个命令会在当前目录创建一个新的 Git 仓库,生成一个 .g…

Spring之整合Mybatis底层源码解析

整合核心思路 由很多框架都需要和Spring进行整合,而整合的核心思想就是把其他框架所产生的对象放到Spring容器中,让其成为Bean。 ​ 比如Mybatis,Mybatis框架可以单独使用,而单独使用Mybatis框架就需要用到Mybatis所提供的一些类…

Hive的存储格式

文章目录 Hive的存储格式1.存储格式简介2.行存储与列存储行式存储列式存储混合的 PAX 存储结构 TextFileSequenceFile Hive的存储格式 1.存储格式简介 Hive支持的存储数的格式主要有:TEXTFILE(默认格式) 、SEQUENCEFILE、RCFILE、ORCFILE、PARQUET。 textfile为默…

【go-zero】goctl笔记

goctl笔记 通过api文件生成go-zero项目 goctl api go --api .\greet.api --dir . --style goZero 快速生成一个api文件 goctl api -o zd.api 校验api文件 goctl api validate --api zd.api 格式化api文件 goctl api format --dir zd.api 快速生成一个http服务 goctl api n…

零基础入门转录组数据分析——预后模型之随机生存森林模型

零基础入门转录组数据分析——预后模型之随机生存森林模型 目录 零基础入门转录组数据分析——预后模型之随机生存森林模型1. 预后模型和随机生存森林模型基础知识2. 随机生存森林模型(Rstudio)——代码实操2. 1 数据处理2. 2 构建随机生存森林模型&…

应用层(Web与HTTP)

目录 常见术语 1.HTTP概况 2.HTTP连接 非持久HTTP流程 响应时间模型 持久HTTP 3.HTTP报文 3.1HTTP请求报文 3.2HTTP响应报文 HTTP响应状态码 4.Cookies(用户-服务器状态) cookies:维护状态 Cookies的作用 5.Web缓冲(…

AOP和注解的配合使用(封装通用日志处理类)

自定义注解 Inherited Documented Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface MyLog {String value() default ""; } 定义切面 Aspect Component Slf4j public class LogAop {// 定义识别自定义注解的切点Pointcut("a…

点餐收银小程序

一、项目概述 Hi,大家好,今天分享的项目是《点餐收银小程序》。 系统含管理员/商家/用户三种角色,商家能维护菜式类别、维护菜品信息,用户在小程序能够选择门店,查看门店下各个分类的菜式信息,并进行加购…

HarmonyOS开发实战( Beta5版)延迟加载lazy-import实践使用指导

随着应用功能持续增加,应用规模不断扩大,依赖的模块文件逐渐变多,应用冷启动加载模块的时间也越来越长。而在实际冷启动过程中执行了很多应用整体依赖但当前未使用的文件,此时可以通过延迟加载 lazy-import 的方法延缓对这些冗余文…

关于解决输入法自动切换无法正常输入文字,此时鼠标旁边出现蓝色圆圈频闪的问题解决

输入法切换时鼠标旁边出现蓝色圆圈频闪,通常表明有某个后台进程正在频繁运行或某个服务在不断启动或崩溃。这可能是导致输入法频繁切换的根本原因。 第一步:检查和终止异常的后台进程 任务管理器: 打开任务管理器 (Ctrl Shift Esc)。在“…

jenv 一款macos下的开源JAVA多版本环境安装管理切换工具

一个用于macos/linux下的多版本JAVA环境管理工具 -- jenv, 这款工具和 pyenv 类似,都是基于shell脚本开发的. 可以方便的管理 多个java环境版本. jenv安装 git clone https://gitee.com/tekintian/jenv.git ~/.jenv jenv环境配置 将下面的代码加入都你的 ~/.bash_profil…