动态链接库与静态链接库的区别

2023-05-16

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。静态链接库与静态链接库调用规则总体比较如下。

对于静态链接库(比较简单):
首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。

生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 函数名(参数表);
在调用程序的.cpp源代码文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定与静态库一起链接

第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

对于动态链接库:
动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我们必须先注意到DLL内的函数分为两种:
(1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。

因此这里衍生出两个问题:
第一:如何调用?即调用的方式
第二:不同调用方式对应的库的生成过程和调用规则

我逐步展开问题。
第一,存在两种调用方式——动态调用和静态调用
第二,两种调用方式的库的生成过程和调用规则
1〉动态调用

生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 __declspec(dllexport) 函数名(参数表);
在调用程序的.cpp源代码文件中按如下流程调用:
在main函数代码的开始处
定义需要的DLL模块的句柄和此DLL模块模块中需要调用的函数的函数指针。
定义好后紧接着就是标准的三部曲:
取得需要的DLL模块------>返回模块句柄
LoadLibrary("DLL模块路径")
取得需要的函数地址———>返回函数指针GetProcAddress(模块句柄,"函数名")
从内存中卸载DLL模块———>FreeLibrary(模块句柄)
2>静态调用
在调用程序的.cpp源代码文件中按如下流程调用:
#include.........
告诉编译器与 DLL 相对应的.lib 文件所在的路径及文件名
#pragma comment(lib,"路径和文件名")
extern "C" 函数返回类型 _declspec(dllimport) 函数名(参数表)分号
int main()
{
..............
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态链接库与静态链接库的区别 的相关文章

  • SUN VirtualBox 的命令行启动/关闭方法简介

    我们可以使用VBxManager 命令行管理工具来查看当前的虚拟基设置 和状态 QHo 64 qhoferrari1k VBoxManage list vms 下面通过实例来说明如何从命令行启动和关闭VirtualBox 虚拟机的两种常用方
  • 运维日记011 - Ubuntu下更改初始用户名的方法

    运维日记011 Ubuntu下更改初始用户名的方法 引子 Ubuntu每两年一次发布的LTS版本都会倍加引人关注 xff0c 因为LTS版本有长达五年的支持周期 xff0c 对于我等不是太喜欢折腾尝鲜而是希望几年之内不用重装系统的用户颇有吸
  • SWIG学习记录(一)SWIG基础

    SWIG学习记录 1 什么是SWIG 1 2 特性1 2 1 预处理 2 SWIG安装3 SWIG基础介绍3 1 运行SWIG3 1 1 输入格式3 1 2 输出3 1 3 注释3 1 4 预编译3 1 5 SWIG指令3 1 6 解析器的
  • Cpp--重载全局的new和delete

    include lt iostream gt include lt process h gt include lt string h gt include lt stdio h gt define MAX SIZE 30000 char M
  • 国外知名音频库一站式资料和简介

    Speex Speex http blog csdn net xyz lmn article details 8013490 简介 Speex是一套主要针对语音的开源免费 xff0c 无专利保护的音频压缩格式 Speex工程着力于通过提供一
  • 一张图进阶 RocketMQ - 整体架构

    前 言 三此君看了好几本书 xff0c 看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接 xff0c 关于 RocketMQ 你只需要记住这张图 xff01 如果你第一次看到这个系列 xff0c 墙裂建议你打开链接 觉得不错的话
  • LUbuntu装向日葵后不能自动登录,lightdm改回sddm

    最近换了LUbuntu xff0c 很喜欢它简洁快速的风格 装了向日葵远控 xff0c 然后就不能登录桌面了 台式机上 xff0c 还可以手动登录 xff0c 笔记本手动也不行 xff0c 得开一个终端输入startx 研究了下 xff0c
  • 牛人 就是这样锤炼出来的,中兴资深工程师,嵌入式专家韦东山是这样炼成的!

    导读 xff1a 还在大学的你 xff0c 不知道未来何去何从 xff1f 都说迷茫是大事做不了 xff0c 小事不想做 还在做程序袁的你 xff0c 是不是也想创业 xff1f 程序袁好创业吗 xff1f Linux好学吗 xff1f 学
  • ethtool---查看网卡以及修改网卡配置工具

    ethtool 命令详解 命令描述 xff1a ethtool 是用于查询及设置网卡参数的命令 使用概要 xff1a ethtool ethx 查询ethx网口基本设置 xff0c 其中 x 是对应网卡的编号 xff0c 如eth0 eth
  • 开源网络模拟器ns-3 架构与实践

  • KBQA相关知识

    码下来 xff0c 慢慢看 xff0c 谢谢各位的分享 1 小象学院 xff1a 王昊奋 2 总结 xff1a https cloud tencent com developer article 1088066 3 KBQA入门 xff1a
  • Android system.img 编辑、增删APK与修改系统配置

    1 环境配置 Debian或Ubuntu系统 xff0c 配置Android开发工具 apt get update apt get install android tools adb android tools fastboot andro
  • SpringMVC接收json字符串转为List对象(数组对象)

    本来项目中的springmvc已配置好的 xff0c 没有问题 xff0c 但是今天突然有个需求 xff0c 需要写一个接口接收json字符串自动转换为List对象 xff0c 查了一下用 64 RequestBody就可以 xff0c 但
  • Lottie 集成动画缺失部分 解决方法

    首先附上Lottie iOS的地址 xff0c 集成方式参见README Lottie 在集成Lottie的时候首先第一步是熟悉基本使用 首先将美工给的JSON文件导入到工程 xff08 本人通过此文顺利指导公司美工导出JSON xff0c
  • SAP 实施新的金融工具 IFRS17规则解析

    在实施新的金融工具 IFRS 规则的过程中 xff0c 保险公司现在看到了保险负债的新标准 经过多年的长期讨论 xff0c IASB 于 2016 年 11 月承诺在 2021 年 1 月 1 日生效 xff0c 并明确表示不会考虑进一步推
  • java 通过HTTP接收json

    一 json接收类 第一个接口为直接传参接收 第二个接口接收json字符串 可以写个HTTP测试类调用测试 也可以postman测试调用 实例方法贴到下面 package com gt information controller impo
  • wget下载速度太慢:mwget

    wget下载速度太慢 xff1a mwget wget相比于mwget下载速度较慢 xff0c mwget是一个多线程的下载应用 xff0c 可以提高下载速度 mwget安装步骤 xff1a span class token functio
  • Docker系列之一:在线安装docker和下载镜像

    目录 1 部署环境 2 在线安装Docker 2 1 卸载已有docker服务 2 2 安装epel更新源 2 3 安装docker仓库 2 4 安装docker 2 5 配置docker镜像下载加速器 2 6 修改docker的默认镜像
  • Docker系列之二:离线安装docker

    目录 4 离线安装docker 适用于系统镜像源已自带相关依赖包 xff1a 4 1 yum源rpm包安装 4 2 官网rpm包直接下载 4 3 二进制压缩包安装 适用于最小系统镜像源无相关依赖包 xff1a 4 4 rpm包安装docke
  • Centos7系统安全漏洞及修复方案

    以下所有漏洞均为Centos7的系统漏洞修复 xff0c 为离线内网环境 xff1b 某些服务由Docker镜像部署 xff1b 此博客内容会根据实际环境出的漏洞检测报告 xff0c 持续更新 一 内网升级服务及命令版本方法 内网环境 xf

随机推荐