【好】C++中lib 和 dll 的区别、生成以及使用详解

vs cpp生成h文件_lib 和 dll 的区别、生成以及使用详解 (给CPP开发者加星标,提升C/C++技能)来源:tenoshttps://www.cnblogs.com/TenosDoIt/p/3203137.html【导读】:在日常开发中,我们只需要知道lib是编译时需要的,dll是运行时需要的。如果要完成源代码的编译,有lib就够了。如果要使动态连接的程序运行起来,有dll就够了。本文会带领我们更加清晰的了解二者的区别、生成、使用,一起来看下吧... 阅读详情

文章转自:http://www.cnblogs.com/panweishadow/p/3632873.html  或者  http://www.cnblogs.com/TenosDoIt/p/3203137.html


lib 和 dll 的区别、生成以及使用详解

【目录】

lib dll介绍

生成动态库

调用动态库

生成静态库

调用静态库


 

首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。

静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件

动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件

那么上述静态库和动态库中的lib有什么区别呢?

静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中

动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。

以下例子均在vs2010上测试


生成和使用动态库

生成动态库

 新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:选择dll--附加选项:选择导出符号--完成

可以看到生成了一个dllmain.cpp 文件,这是dll应用程序的入口,注意它和普通工程的入口main函数不同,这个文件我们不需要修改。

 在这个动态库中我们举例导出一个变量,一个类,一个函数,头文件dll.h如下:

复制代码
 1 //新建生成dll的工程时,vs默认定义了宏DLL_EXPORT,因此,DLL_API 是 __declspec(dllexport),用来导出
 2 //当我们在静态调用dll时,我们包含该头文件,由于没有定义DLL_EXPORT,所以DLL_API是
 3 //__declspec(dllimport),用来导入
 4 #ifdef DLL_EXPORTS
 5 #define DLL_API __declspec(dllexport)
 6 #else
 7 #define DLL_API __declspec(dllimport)
 8 #endif
 9 
10 // 导出类
11 class DLL_API Cdll {
12 public:
13     Cdll(void);
14     // TODO: 在此添加您的方法。
15 };
16 
17 //导出变量,变量在.cpp文件中定义
18 extern DLL_API int ndll;
19 
20 //导出函数,加extern "C",是为了保证编译时生成的函数名不变,这样动态调用dll时才能
21 //正确获取函数的地址
22 extern "C" DLL_API int fndll(void);
复制代码

dll.cpp 文件如下:

复制代码
 1 #include "dll.h"
 2 
 3 
 4 // 这是导出变量的一个示例
 5 DLL_API int ndll=6;
 6 
 7 // 这是导出函数的一个示例。
 8 DLL_API int fndll(void)
 9 {
10     return 42;
11 }
12 
13 // 这是已导出类的构造函数。
14 // 有关类定义的信息,请参阅 dll.h
15 Cdll::Cdll()
16 {
17     return;
18 }
复制代码

调用动态库

有两种方法调用动态库,一种隐式链接,一种显示链接。

调用动态库:隐式链接【又称隐式调用或静态调用】

隐式链接 需要.h文件,dll文件,lib文件

(1)将dll放到工程的工作目录

(2)设置项目属性--vc++目录--库目录为lib所在的路径

(3)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragma comment(lib, “**.lib”))

(4)在源文件中添加.h头文件

然后就像平常一样调用普通函数、类、变量

调用动态库:显示链接【又称显示调用或动态调用】

显示链接 只需要.dll文件,但是这种调用方式不能调用dll中的变量或者类(其实可以调用类,但是相当麻烦,有兴趣者可参考http://blog.youkuaiyun.com/jdcb2001/article/details/1394883 【或者参考本博客的“怎样从一个DLL中导出一个C++类”一文,对理解com也有帮助】)

显示调用主要使用WIN32 API函数LoadLibrary、GetProcAddress,举例如下:

复制代码
 1 typedef int (*dllfun)(void);//定义指向dll中函数的函数指针
 2     HINSTANCE hlib = LoadLibrary(".\\dll.dll");
 3     if(!hlib)
 4     {
 5         std::cout<<"load dll error\n";
 6         return -1;
 7     }
 8     dllfun fun = (dllfun)GetProcAddress(hlib,"fndll");
 9     if(!fun)
10     {
11         std::cout<<"load fun error\n";
12         return -1;
13     }
14     fun();
复制代码

生成和使用静态库

生成静态库

新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:选择静态库

静态库项目没有main函数,也没有像dll项目中的dllmain。

创建项目后添加.h文件,添加相应的导出函数、变量或类,如下所示

复制代码
 1 #ifndef _MYLIB_H_
 2 #define _MYLIB_H_
 3 
 4 void fun(int a);
 5 
 6 extern int k;
 7 
 8 class testclass
 9 {
10 public:
11     testclass();
12     void print();
13 };
14 
15 #endif
复制代码

.cpp文件如下

复制代码
 1 #include "stdafx.h"
 2 #include "lib.h"
 3 #include <iostream>
 4 
 5 void fun(int a)
 6 {
 7     std::cout<<a<<"lib gen\n";
 8 }
 9 
10 int k = 222;
11 
12 testclass::testclass()
13 {
14     std::cout<<"123\n";
15 }
16 
17 void testclass::print()
18 {
19     std::cout<<"this is testcalss\n";
20 }
复制代码

编译工程后就会生成一个.lib文件

使用静态库

需要.h文件,lib文件

(1)设置项目属性--vc++目录--库目录为lib所在的路径

(2)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragma comment(lib, “**.lib”))

(3)在源文件中添加.h头文件

然后就像平常一样调用普通函数、类、变量,举例如下:

复制代码
 1 #include <iostream>
 2 #include "lib.h"
 3 
 4 #pragma comment(lib, "lib.lib")
 5 
 6 int main()
 7 {
 8     fun(4);
 9     std::cout<<k<<std::endl;
10     testclass tc; 
11     tc.print();
12     return 0;
13 }
复制代码

 【版权声明】转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3203137.html




【C++】封装 调用 dll / lib 笔记用,有错误欢迎指出,谢谢。 一、lib文件 静态链接库文件,需要在主程序编译时一起编译生成exe。 二、dll文件 动态链接库文件,可在程序运行时才调用,无需编译时一起打包。 三、封装和调用 lib/dll文件 1、lib 文件的封装和 dll 类似,在导出时选则即可。 2、打包生成 lib 文件时,只会生成 .lib(大小较大)文件。 调用 .lib,需要 .h + .lib;因为有头文件,调用时正常使用头文件中函数即可。 3、打包生成 dll 文件时,会生成 .lib(大小较小). 阅读详情

相关推荐

LIB,DLL区别 及 QT中如何添加LIB,DLL

LIB和DLL文件在创建工程项目时是必须要面对的,下面的文章讲述了如何添加LIB和DLL文件以及两者的区别。1.加载lib/头文件分两种方法:(1)适用于当前项目1 第一步:项目-&gt;属性-&gt;C/C++-&gt;常规-&gt;附加包含目录(浏览.h文件的路径)   添加包含文件 2 第二步:项目-&gt;属性-&gt;C/C++-&gt;链接器-&gt;输入-&gt;附加依赖项(写入li...

qq_15458957的博客 3335

lib 和 dll 的区别、生成以及使用详解

【目录】 lib dll介绍 生成动态库 调用动态库 生成静态库 调用静态库 首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。 静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部...

weixin_34413357的博客 705

WinForm制作文件传输助手,Tcp局域网传输文件,传输速度受限于宽带和硬盘速度上限

文件传输助手为什么会出现,是因为项目上有些特殊的地方限制太多了,连插硬盘都需要关软件,联网又要开很不方便,网络限制一般软件只能局域网通信,还要开特定的端口等,你才能在电脑上通信,这样和机房的服务器远程的时候文件就不好拿过去,又不可能每次都去开机房的门。现在这个功能比较简单,只能单文件发送,但是其实比U盘硬盘方便,一般的六类网线传输压缩包在50M/s以上,U盘硬盘复制就不行了,特别如果是像我们学校这种网络结构,一个学校都在一个局域网,那真的方便!普通的局域网用特定IP和端口,通信也是很方便的。

m0_69233031的博客 1670

C++:LIB和DLL的区别与使用

共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。 一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。 共有两种链接方式: 动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。 静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,

Z_Paper的博客 2574

【架构师面试-缓存与搜索-1】-缓存与缓存置换策略源码实现

1:什么是缓存 缓存:加速数据访问的存储,降低延迟(latency),提升吞吐量(Throughput)的利器。 1:缓存演进历史 1. 查库 2. ConcurrentHashMap 3. LRU 4. Guava Cache 5. 分布式缓存(redis,MemCache) 6. 多级缓存 2:在什么地方加缓存 缓存对于每个开发者来说是相当熟悉了,为了提高程序的性能我们会去加缓存,但是在什么地方加缓存,如何加缓存呢? 举个栗子:假设一个网站,需要提高性能,缓存可以放在浏览器,可以放

chongfa2008的博客 6437

高效管理Node.js版本与pnpm安装全攻略

本文提供了一套高效管理Node.js版本与pnpm安装的完整攻略。针对开发中常见的版本冲突和磁盘空间问题,详细介绍了如何在Windows和Ubuntu系统上安装并配置pnpm,并重点讲解了如何利用其内置的`pnpm env`命令进行Node.js版本管理,实现一站式环境管理,提升开发效率。

weixin_28840591的博客 312

dll文件和lib文件的区别和联系

动态链接 vs. 静态链接:DLL 文件是动态链接库文件,它在运行时被加载到内存中,并通过动态链接的方式提供函数和资源给程序使用。LIB 文件是静态链接库文件,它在编译时将库代码直接复制到生成的可执行文件中,程序在运行时不需要外部的依赖文件。共享的代码和资源:DLL 文件和 LIB 文件都包含可重用的代码和资源,通过它们,多个程序可以共享相同的代码实现。函数声明和链接:无论是使用 DLL 文件还是 LIB 文件,都需要在程序中进行函数声明,以便在编译时或运行时正确链接和调用库中的函数。

m0_48701975的博客 1310

从FedAvg到实战:手把手教你用PyTorch复现联邦学习经典论文实验(MNIST/CIFAR-10)

本文详细介绍了如何使用PyTorch复现联邦学习经典算法FedAvg在MNIST和CIFAR-10数据集上的实验。从环境搭建、数据非IID划分到模型实现和参数聚合,手把手教你掌握联邦学习的核心技术与实战技巧,帮助开发者和研究人员快速实现隐私保护的分布式机器学习方案。

weixin_29053695的博客 252

静态库和动态库的区别以及在C/C++中的调用方法

静态库(.lib)和动态链接库(.dll)是在Visual Studio(VS)中开发和构建应用程序时使用的两种不同类型的库文件,它们在应用程序开发中有不同的用途和特性。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 5362

YOLO26涨点改进 | 独家创新,特殊场景检测篇 | TGRS 2025 | 引入FAENet特征自适应增强网络,专注于恶劣天气条件下的目标检测(低光场景、雾天场景、雨雪场景、复杂环境等)即插即用

🔥本文提出了一种名为FAENet的特征自适应增强网络,可有效提升YOLO26在恶劣天气条件下的目标检测性能。FAENet通过拉普拉斯金字塔分解思想,将输入特征分为低频和高频两部分进行针对性增强:低频分支强化全局轮廓,高频分支增强边缘纹理细节。该模块设计轻量、可端到端训练,在不改变原始图像分布的前提下,显著缓解雾霾、低照度等复杂环境造成的特征退化问题。实验表明,该方法在多个恶劣天气数据集上超越了当前最优检测器,同时保持了轻量级和高速度特性。

Ai缝合怪、助力小伙伴高效发论文 333

【目标跟踪】基于Kalman滤波实现无人机运动轨迹跟踪附matlab代码

1 简介 在近代控制中,需要对某一特定的运动目标进行跟踪监测,并需要对其下一时间的运动位置,运动方向,速度等信息进行预先估算,才能达到对目标的即时控制.本文简要讨论了用卡尔曼滤波算法对单个目标航迹进行预测,并借助于Matlab仿真工具,对实验的效果进行评估. 2 部分代码 clc; close all; %initial state xo=25; vox=2; %Observations **** % X-Direction Calcula

qq_59747472的博客 4731

C++ 调用dll及lib的区别

C++ 调用DLL方法   ①LIB文件直接加入到工程文件列表中  在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。  ②设置工程的 Project Settings来加载DLL的LIB文件  打开工程的 Project Settings菜单,选中Link,然后...

240

HTML金色流星雨(完整代码)

HTML实现金色流星雨动态效果的完整代码。

AIGC 992

C++中lib 和 dll 的区别、生成以及使用详解

文章转自:http://www.cnblogs.com/panweishadow/p/3632873.html  或者  http://www.cnblogs.com/TenosDoIt/p/3203137.html lib 和 dll 的区别、生成以及使用详解 【目录】 lib dll介绍 生成动态库 调用动态库 生成静态库 调用静态库

Lee_Shuai的博客 1371

【零基础入门unity游戏开发——unity通用篇12】导入导出unity资源包、设置编程工具、创建脚本(组件)规则、MonoBehaviour基类介绍、脚本模板(基于unity6开发介绍)

导入导出unity资源包、设置编程工具、创建脚本(组件)规则、MonoBehaviour基类介绍、脚本模板(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 758

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C/C++】lib 和 dll 的区别、生成以及使用详解

  VS开发多功能模块的项目时,负责不同模块的人员因为权限问题,不能拿到所有源码,但又需要进行功能模块的融合,这就需要使用dll、lib进行“代码共享”。在学习dll和lib时,找到了篇讲解十分详细的博文,因此转载供自己和更多的人学习,原文链接分享如下:http://www.cnblogs.com/TenosDoIt/p/3203137.html,感谢原博主的精心总结。 -----------...

AMG_GT的博客 2006

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lib和dll文件的区别和联系

lib和dll lib和dll文件的区别和联系 .dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。.lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在

cxin917的专栏 2464

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

lib和dll的区别,生成以及使用详解

静态库:在链接步骤中,连接器将库文件取得所需的代码,复制到生成的可执行文件中,这种库叫做静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令全部被直接包含在最终生成的exe文件中。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。 动态库:动态库链接是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行的文件...

Cutepingping的博客 1万+

【C++】DLL和LIB的含义及使用场景和区别

DLL和LIB的含义及使用场景和区别

weixin_44939430的博客 1815

C++ Dll和Lib、封装使用C++库、封装使用C库

用于快速回顾之前遗漏或者补充C++知识。

zzzsss123333的博客 1505

关于Dll和lib的区别及作用

在学校的时候只是纯粹学习编程知识,并

1万+

Qt 生成dll和lib方法及简单使用介绍

1.点击新建文件或项目,点击选择,如下图: 然后正常去创建(与普通构造app项目一致),创建名称为testlesson,生成如下图所示, 其中Testlesson.h代码如下 这里面简单解释一下,TESTLESSONSHARED_EXPORT是个宏定义,在testlesson_global.h中有体现,这个TESTLESSONSHARED_EXPORT相当于一个导出的意思,把这个类导出,下面自己定义了一个函数叫testfuntion,也是导出,共后面使用: #ifndef TESTLESSON_H #d

weixin_45233585的博客 1万+

使用vs封装c++成dll和lib

使用vs封装c++成dll和lib dll和lib 简介 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”。在很多Windows程序中包含有许多dll文件,在程序运行时调用。有着消耗资源比较少,动态加载,程序模块化和简化安装和部署的特点。 Static library .lib是一种文件名后缀,代表的是静态数据连接库,在w...

akjw008的专栏 6166

C++生成和使用dll和lib

dll和lib: 动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。和可执行文件(exe)非常类似,区别在于dll中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。 静态链接库(lib)包含函数代码本身,在编译时直接将代码加入程序当中。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费

wxc237786026的专栏 1万+

dll和lib的区别和使用

简介 lib(静态库,library):lib分为两种,一种是通常意义上的静态库,里面是函数实现代码;还有一种是导出库,配合dll使用,实现隐式调用。两者都是用于静态链接,在生成目标模块后,lib文件就没有用了。 dll(动态库,dynamic link library):dll用于动态编译,调用dll的程序本身只有导出函数的声明,而将实现过程放到dll中,这样dll就可以提供给多个程序使用,大大减少了程序体积,是实现代码复用的重要手段。编译的时候不需要dll,运行时却必不可少。 总之:lib相当于代替cp

ZhangjieZzJ的博客 3363
上一篇: 怎样从一个DLL中导出一个C++类
下一篇: hao-单例模式(Singleton)
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值