「C/C++」C/C++静态链接库与动态链接库

news2024/11/24 21:03:06

在这里插入图片描述

博客主页:何曾参静谧的博客
文章专栏:「C/C++」C/C++学习

目录

  • 相关术语
  • 案例环境:Win10+VS2019
  • 一、链接库介绍
  • 二、静态链接库(Static Library)
    • 2.1、静态库优缺点
    • 2.2、静态库的创建
      • 2.2.1、创建静态库项目
      • 2.2.2、添加.h头文件和.cpp文件
      • 2.2.3、编译生成.lib文件
    • 2.3、静态库的使用
  • 三、动态链接库(Dynamic Linking Library)
    • 3.1、动态库优缺点
    • 3.2、动态库的创建
      • 3.2.1、创建动态库项目
      • 3.2.2、添加dllsum.h头文件和dllsum.cpp文件
      • 3.2.3、编译生成dllsum.lib与dllsum.dll文件
    • 3.3、动态库*.dll使用
      • 3.3.1方法一:直接使用
      • 3.3.2方法二:使用LoadLibrary()


相关术语

静态链接库(Static Linking Library):是在编译时将库代码与应用程序静态链接在一起的库。它们被编译为二进制文件,并在运行时作为应用程序的一部分被载入内存。这种库被称为“静态”是因为它们在编译时被链接,这意味着它们的代码与应用程序的其余部分被编译为单个二进制文件。文件后缀:.lib.a
动态链接库(Dynamic Linking Library):是在应用程序运行时才被加载到内存中的库。它们不会被编译为二进制文件,而是被存储为单独的文件。这些库共享代码,并被多个应用程序使用,以提高效率和避免代码冗余。文件后缀:.dll.so

案例环境:Win10+VS2019

代码的分发方式:

  1. 源码方式头文件+源文件
  2. 动态库方式头文件+lib文件+dll文件
  3. 静态库方式头文件+lib文件

一、链接库介绍

链接库(library)是一种常见的软件开发概念,指的是包含可重用代码的二进制文件(通常是动态链接库)。在运行时,程序可以将某个库链接到自己的代码中,从而使用该库中的函数和其他代码。链接库的使用可以提高代码的复用性、减少程序体积、加快编译速度等。

平台集静态库动态库
Windows.lib文件.dll文件
Linux.a文件.so文件
Mac OS.a文件.dylib文件

C语言和C++的常用的CRT,后面红色的d代表多线程,p代表C++

C语言C++
静态库libc.lib 或 libcd.lib
libcmt.lib 或 libcmtd.lib
LIBCP.LIB 或 LIBCPD.LIB
LIBCPMT.LIB 或 LIBCPMTD.LIB
动态库msvcrt.dll 或 msvcrtd.dllMSVCPRT.DLL 或 MSVCPRTD.DLL

二、静态链接库(Static Library)

静态链接库(Static Linking Library):是在编译时将库代码与应用程序静态链接在一起的库。它们被编译为二进制文件,并在运行时作为应用程序的一部分被载入内存。这种库被称为“静态”是因为它们在编译时被链接,这意味着它们的代码与应用程序的其余部分被编译为单个二进制文件。文件后缀:.lib.a

2.1、静态库优缺点

静态链接库的优点:

  • 一劳永逸:在程序编译时,所有需要的库的代码都被打包成一个可执行文件。这样一来,在将程序运行到其他机器上时,您不必再携带各种动态库而是只需一份可执行文件就好了。
  • 执行速度更快:因为所有代码都在一个文件中,所以不需要运行时加载,执行速度很快。
  • 不会出现库版本冲突问题

静态链接库的缺点:

  • 占用空间较大,相同功能的多个程序都要各自有一份库文件
  • 更新麻烦,每次修改库文件都需要重新编译与分发

2.2、静态库的创建

2.2.1、创建静态库项目

2.2.2、添加.h头文件和.cpp文件

以一个简单求和函数为案例,创建两个文件libsum.h,libsum.cpp

libsum.h文件

#pragma once
int sum(int a, int b);

libsum.cpp文件

#include "libsum.h"
int sum(int a, int b){
	return a + b;
}

2.2.3、编译生成.lib文件

2.3、静态库的使用

  • 包含头文件的libsum.h头文件#include"libsum.h"
  • 包含libsum.lib文件两种方法:
    – 方法一:文件中添加 #pragma comment(lib,"libsum.lib")
    – 方法二:右键项目->属性->配置属性->链接器->输入->附加依赖项->libsum.lib

main.cpp

#include"libsum.h"
#include <iostream>
#pragma comment(lib,"libsum.lib")

int main(){
	cout << sum(11,22) << endls;
	return 0;
}

三、动态链接库(Dynamic Linking Library)

动态链接库(Dynamic Linking Library):是在应用程序运行时才被加载到内存中的库。它们不会被编译为二进制文件,而是被存储为单独的文件。这些库共享代码,并被多个应用程序使用,以提高效率和避免代码冗余。文件后缀:.lib.so

3.1、动态库优缺点

动态链接库的优点:

  • 节约内存和代码重用:当应用程序使用动态链接时,多个应用程序可以共享磁盘上单个DLL副本。
  • 便于更新和维护:只需替换动态链接库,程序就能获取新的功能。
  • 可扩展性:DLL文件与EXE文件独立,只要接口不变,升级程序只需要更新DLL文件不需要重新编译应用程序。
  • 复用性:DLL的编译与具体的编译语言及编译器无关,不同语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数。

动态链接库的缺点:

  • DLL HELL(DLL地狱):在增加成员变量、修改导出类的基类等操作可能导致意想不到的后果。
  • 需要载入时才能使用,/runtime,例如QTGUI库
  • 多进程间的共享使用需要考虑锁的问题,
  • 存在库版本冲突问题

3.2、动态库的创建

3.2.1、创建动态库项目

3.2.2、添加dllsum.h头文件和dllsum.cpp文件

以一个简单求和函数为案例,创建两个文件dllsum.h,dllsum.cpp
需要使用到_declspec(dllexport)进行函数导出,extern"C"为强制使用C语言语法(无法函数重载)。

dllsum.h文件

#pragma once
extern"C" _declspec(dllexport) int sum(int a, int b);

dllsum.cpp文件

#include "dllsum.h"
int sum(int a, int b){
	return a + b;
}

3.2.3、编译生成dllsum.lib与dllsum.dll文件

PS:此处的.lib文件不是静态库文件而是dll的符号文件。

3.3、动态库*.dll使用

3.3.1方法一:直接使用

  • 包含头文件的头文件#include "dllsum.h"
  • 包含dllsum.lib文件两种方法:
    – 方法一:文件中添加 #pragma comment(lib,"dllsum.lib")
    – 方法二:右键项目->属性->配置属性->链接器->输入->附加依赖项->dllsum.lib
  • 🎈使用时文件中需要包含dllsum.dll文件

main.cpp

#include "dllsum.h"
#include <iostream>
#using namespace std;
#pragma comment(lib,"dllsum.lib")
extern "C"  _declspec(dllimport)  int sum(int a, int b);
int main(){
	cout << sum(11,22) << endl;
	return 0;
}

3.3.2方法二:使用LoadLibrary()

  • 加载动态库:LoadLibrary()
HMODULE WINAPI LoadLibrary(
_In_LPCWSTR lpLibFileName, //动态链接库的名称
);//返回值:调用成功,返回库模块的句柄。调用失败返回0。
  • 获取函数地址:GetProcAddress()
FARPROC WINAPI GetProcAddress(
HMODULE hModule, //模块的句柄
LPCSTR lpProcName //函数名 或 WORD叙数值
);//返回值:调用成功,输出函数地址。调用失败返回NULL。
  • 释放动态库:FreeLibrary()
BOOL WINAPI FreeLibrary(
_In_HMODULE hLibModule //模块的句柄
);
  • 获取错误信息:GetLastError()

main.cpp

#include <iostream>
#include <windows.h>
#using namespace std;

int main(){
	//1.加载dll
	HMODULE h = LoadLibrary("dllsum.dll");
	//2.获取函数地址
	typedef int(*PDLLSUM)(int,int);
	//3.利用函数指针调用函数
	if(1)
		PDLLSUM pdllsum = (PDLLSUM)GetProcAddress(h,"sum");//通过函数名调用
	else
		PDLLSUM pdllsum = (PDLLSUM)GetProcAddress(h,char*)1);//通过序号调用
	cout << pdllsum(11,22) << endl;
	//4.释放dll
	FreeLibrary(h);
	return 0;
}

在这里插入图片描述

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

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

相关文章

实战案例分享 | 临近假期,项目突发各种问题…

五一的调休补班一下子把三个星期的作息成功打乱&#xff0c;大家在吐槽的同时也不忘给自己延长假期&#xff0c;平时加班攒下的假期都充分利用上了。但办公室的项目经理小李这两天总长吁短叹&#xff0c;感觉假期也要随时随地办公。一问才知原来是临近假期时&#xff0c;项目突…

ARL灯塔(无需VPS版)

标题随便写&#xff0c;能看到都是有缘人 搭建灯塔那么繁琐的步骤&#xff0c;远不如爆破一个灯塔是吧(狗头) 而且还可能买不起VPS的情况(例如我) 那不如写一个脚本去爆破灯塔的弱口令 整治网络安全 从你我做起 fofa语法&#xff1a; icon_hash"1708240621"…

零售新时代,零售行业数字化破局的新路径

深夜11点&#xff0c;门店店长小张还在加班&#xff0c;因为小张还需要盘点今日销售额、库存等信息&#xff0c;这些整理好的数据需要手动录入至总公司的系统中。 多门店的零售行业中&#xff0c;这是他们每天的工作日常&#xff1a;门店先通过excel做手工报表&#xff0c;再把…

ubuntu20.04之--CUDA的安装

文章目录 CUDA文件的下载CUDA文件下载地址 CUDA文件的安装安装结果 环境变量的配置CUDA安装结果验证 CUDA文件的下载 CUDA文件下载地址 https://developer.nvidia.com/cuda-toolkit-archive 选择合适自己电脑的版本进行下载&#xff0c;下载命令如下&#xff1a; $ wget htt…

【产品分析】如何利用咖喱外卖店铺数据进行营销分析Python

在外卖平台上经营咖喱店铺时&#xff0c;海量的订单数据和用户评价等信息将成为商家优化营销策略的重要依据。然而&#xff0c;面对大量的数据&#xff0c;如果没有合适的分析方法&#xff0c;这些数据就变得毫无意义。本文将介绍如何使用Python中常用的可视化工具和方法&#…

Stable Diffusion使用方法

SD的本地安装教程有很多我就不重复了&#xff0c;这里主要是记录我在使用SD Webui的过程中遇到的问题&#xff0c;总结的一些提升出图效率&#xff0c;出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 &#xff1f; Ok&#xff0c;以上只是一小部分成品 &#xff0c;属…

2023年易派客工业品展圆满落幕 期待与您再次相遇

党的二十大指出&#xff0c;建设现代化产业体系。坚持把发展经济的着力点放在实体经济上&#xff0c;推进新型工业化&#xff0c;加快建设制造强国、质量强国、航天强国、交通强国、网络强国、数字中国。 中国石化深入学习贯彻党的二十大精神&#xff0c;以打造世界领先洁净能源…

【严重】Strapi <4.5.6 远程代码执行漏洞(POC)(CVE-2023-22621)

漏洞描述 Strapi是Node.js开发的开源内容管理系统&#xff0c;Users-Permission 插件的电子邮件模板系统用于管理与用户权限相关的电子邮件通知(默认启用)。 Strapi 4.5.6之前版本中&#xff0c;Users-Permission 插件的电子邮件模板系统存在 SSTI&#xff08;服务器端模板注…

Linux必会100个命令(五十九)journalctl

不带参数&#xff0c;将输出所有的日志。 使用-r参数&#xff0c;输出为反序 使用-f查看最新的日志 使用-n 输出指定行数 使用--since和--until输出一段时间内的日志 查看昨天的日志&#xff1a; journalctl --since yesterday 查看10点以后2小时的日志&#xff1a; journal…

票务将引领生活方式

随着五一假期临近&#xff0c;很多人已经开始筹划假期出行计划&#xff0c;门票作为出行中最重要的一环&#xff0c;也成为了大家关注的重点。因为门票不仅能看出景区的人气&#xff0c;也能体现出景区的特色。 虽然现在很多景区都有数字化票务系统&#xff0c;但大多只能实现…

制药专业转行软件测试,带我的师傅在这干了两年半,最终还是跑路了......

故事的开始 最近这几天有点忧伤&#xff0c;因为带我的师傅要跑路了&#xff0c;嗯&#xff0c;应该说已经跑路了&#xff0c;他是制药专业的&#xff0c;已经在这个公司干了两年半了。其实今年3月份的时候他就跟我说他要跑路了&#xff0c;然后我说&#xff0c;要不你先把五一…

成人高考入学考试,考什么内容?

一、成考考试科目考试总分&#xff1a;高起专&#xff08;450分&#xff09;、高起本&#xff08;600分&#xff09;、专升本&#xff08;450&#xff09; 高起专主要考&#xff1a;语文、数学&#xff08;文数/理数&#xff09;和外语 高起本主要考&#xff1a;语文、数学(文…

一款支持全文检索、工作流审批、知识图谱的企事业知识库

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 获取方式q:262086839 为什么建立知识库平台&…

openpnp - Smoothieware project build

文章目录 openpnp - Smoothieware build概述笔记用vs2022打开工程, 进行code review, 编译工程现在来看看X-PAXES的问题查一下我的配置文件中 mm_per_arc_segment 配置项, 在官方文档中没有说明的问题剩下事情, 就是看逻辑了.END openpnp - Smoothieware build 概述 在自己设…

Centos7安装Redis

一、安装gcc依赖 由于 redis 是用 C 语言开发&#xff0c;安装之前必先确认是否安装 gcc 环境&#xff08;gcc -v&#xff09;&#xff0c;如果没有安装&#xff0c;执行以下命令进行安装 [rootlocalhost local]# yum install -y gcc 二、下载并解压安装包 [rootlocalhost l…

opengauss 上mysql_fdw的编译、安装和使用

一、编译安装mysql_fdw 在编译opengauss时&#xff0c;configure中指定--enable-mysql-fdw&#xff0c;就可以一起把mysql_fdw编译出来&#xff0c;并且make install时也会安装相关文件和库&#xff0c;但是&#xff0c;有个前提&#xff0c;就是编译机器上要安装mariadb-libs…

关于HTML5画布canvas的功能

一、画布的使用 1、首先创建一个画布&#xff08;canvas&#xff09; <canvas id”myCanvas” width”200” height”100” style”border:1px solid #000000”></canvas> 2、使用JavaScript来绘制图像 <script> Var cdocument.getElementByID(“myCanv…

【C++】面向对象之多态

文章内的所有调试都是在vs2022下进行的&#xff0c; 部分小细节可能因编译器不同存在差异。 文章目录 多态的定义和实现概念引入多态的构成条件虚函数重写通过基类的指针或者引用调用虚函数 override和final 抽象类概念实现继承和接口继承 虚函数表单继承中的虚表打印虚表多继…

实时聊天对客户服务和销售推力有多大?(一)

实时聊天对于跨境电商客户服务来说&#xff0c;已经是不可或缺的存在。那么&#xff0c;他对于跨境电商增加销售量&#xff0c;改进客户服务有什么好处呢&#xff1f;接着往下看。 实时聊天对客户服务的好处 1.实时聊天可让您提供令人愉快的支持 将实时聊天作为客户支持产品…

反转字符串——leetcode344、leetcode541

文章目录 简单反转字符串题目详情分析Java完整代码 反转链表进阶问题题目详情分析Java完整代码 简单反转字符串 题目详情 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须…