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

这篇具有很好参考价值的文章主要介绍了「C/C++」C/C++静态链接库与动态链接库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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


相关术语

静态链接库(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.dll MSVCPRT.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;
}

「C/C++」C/C++静态链接库与动态链接库文章来源地址https://www.toymoban.com/news/detail-428796.html

到了这里,关于「C/C++」C/C++静态链接库与动态链接库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】动态库与静态库

    目录 一、前言 二、静态库与动态库 三、生成静态库 1、生成原理 2、完整过程 3、总结 四、生成动态库 1、环境变量 2、建立软链接 3、配置文件 五、动态库的加载 1、动态库加载的过程 2、动态库地址的理解 3、补充内容  关于动态库与静态库的一小部分前置内容,我曾在文

    2024年02月01日
    浏览(51)
  • 【计算机网络】 静态库与动态库

    库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。静态库是将整个库文件都拷贝到可执行文件中了,而动态库只是将索引文件拷贝到可执行文件中,可以通过索引文件找到动态库文件。 静态库实践 使用方法 首先我们用vs创建一个静态库,再创建

    2024年02月09日
    浏览(52)
  • Linux中的动态库与静态库

    软链接 当我们不在本地路径下运行时,运行目标二进制文件一般要写明该程序路径. 但是这样运行对于路径较为复杂的程序极为耗费时间,为了简便操作,我们可以将该可执行程序的路径设置为软链接.此时的软链接一般也可认为是windows可执行程序的快捷方式. 创建软链接命令如下

    2024年02月12日
    浏览(44)
  • CMake构建静态库与动态库以及使用

    用例子的方式通俗易懂地解释CMake构建静态库与动态库的过程。 任务: 建立一个静态库和动态库,提供HelloFunc 函数供其他程序编程使用,HelloFunc向终端输出Hello World 字符串。 安装头文件与共享库。 编写一个程序去使用构建的共享库。 (1)建立 t3 目录,用于存放本节涉及到

    2024年02月07日
    浏览(40)
  • 深入理解Linux中的动态库与静态库

                                                      🎬慕斯主页 : 修仙—别有洞天                                                 ♈️ 今日夜电波:I Wish My Mind Would Shut Up—Ivoris                                                          

    2024年01月24日
    浏览(48)
  • 【Linux】静态库与动态库制作及运行原理

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 先来总体描述下静态库与动态库的区别. 静态库是将头文件总体复制到可执行文件当中 。 动态库是在可执行程序运行时进行了动态链接 (所需要某个实现方法就去内存中查找). 所

    2024年02月05日
    浏览(34)
  • VS2019静态库与动态库入门操作指南

    源代码的二进制文件; 分为动态编译与静态编译; 1)区别 (1)动态编译不便于发布,静态编译便于发布; (2)动态编译生成的可执行文件体积较小,静态生成的可执行文件体积较大。 ​ Windows中静态库后缀为.lib 动态库后缀为.dll ​ Linux中静态库后缀为.a 动态库后缀为.

    2024年02月06日
    浏览(42)
  • C/C++库之谜:动态库与静态库探秘

    在软件开发领域,动态库与静态库是常用的编程工具,它们的核心功能是为开发人员提供代码复用的便利性。动态库和静态库可以极大地简化开发流程,提高代码的可维护性。本文旨在探讨动态库与静态库的意义以及应用场景,分析它们在不同系统环境中的特点,并通过实际

    2023年04月20日
    浏览(42)
  • .NET Native AOT的静态库与动态库

    .NET不仅可以使用 C静态库与动态库,也可以将.NET实现的函数导出为C静态库与动态库。在没有Native Aot之前,.NET只能通过P/Invoke享受C/C++生态,而在Native Aot之后,不仅可以享受这些生态,还可以开发SDK供其他语言调用。 .NET Native AOT的NativeLib参数用于指定本机库的类型。在.NET

    2024年02月16日
    浏览(37)
  • QT 链接动态库 (静态链接 条件编译 动态加载)

    本篇文章以我实际使用过程为例,在此总结一下qt链接动态库的几种方式 使用的动态库为libzint.so,库目录为/usr/local/lib 第一种为直接将库添加到QT中,可以看成静态库 通过pro文件添加链接 在用到外部库的程序代码中直接 这样就可以直接调用外部库的中结构体与函数接口 可以

    2024年01月20日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包