Windows下静态、动态库的封装和使用(图解)(下)

简介: Windows下静态、动态库的封装和使用(图解)

方法二:使用编译语句


#pragma comment(lib,"./mylib.lib")


测试代码:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma comment(lib,"./mylib.lib")
int main() {
  printf("调用myadd函数:1+2=%d",myadd(1,2));
  return 0;
}


运行结果为:



方法三:添加工程中


就像你添加.h和.c文件一样,把lib文件添加到工程文件列表中去.


切换到"解决方案视图"—>选中要添加lib的工程–>点击右键–>“添加”–>“现有项”–>选择lib文件–>确定



测试代码:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
  printf("调用myadd函数:1+2=%d",myadd(1,2));
  return 0;
}


运行结果为:



静态库优缺点


  • 静态库对函数库的链接是放在编译时期完成的,静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;


  • 程序在运行时与函数库再无瓜葛,移植方便。


  • 浪费空间和资源,所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。


内存和磁盘空间上:


静态链接这种方法很简单,原理上也很容易理解,在操作系统和硬件不发达的早期,绝大部门系统采用这种方案。随着计算机软件的发展,这种方法的缺点很快暴露出来,那就是静态链接的方式对于计算机内存和磁盘空间浪费非常严重。


特别是多进程操作系统下,静态链接极大的浪费了内存空间。在现在的linux系统中,一个普通程序会用到c语言静态库至少在1MB以上,那么如果磁盘中有2000个这样的程序,就要浪费将近2GB的磁盘空间。


程序开发和发布上:


空间浪费是静态链接的一个问题,另一个问题是静态链接对程序的更新、部署和发布也会带来很多麻烦。比如程序中所使用的mylib.lib是由一个第三方厂商提供的,当该厂商更新容量mylib.lib的时候,那么我们的程序就要拿到最新版的mylib.lib,然后将其重新编译链接后,将新的程序整个发布给用户。这样的做缺点很明显,即一旦程序中有任何模块更新,整个程序就要重新编译链接、发布给用户,用户要重新安装整个程序。


windows下动态库创建和使用


要解决空间浪费和更新困难这两个问题,最简单的办法就是把程序的模块相互分割开来,形成独立的文件,而不是将他们静态的链接在一起。简单地讲,就是不对哪些组成程序的目标程序进行链接,等程序运行的时候才进行链接。也就是说,把整个链接过程推迟到了运行时再进行,这就是动态链接的基本思想。


动态库的创建


1.创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入mydll。点击确定。



2.在解决方案资源管理器的头文件中添加,mydll.h文件,在源文件添加mydll.c文件(添加新建项)。



3.在test.h文件中添加如下代码:


#ifndef MYDLL_H
#define MYDLL_H
__declspec(dllexport) int myminus(int a, int b);
#endif


4.在test.c文件中添加如下代码:


#include"mydll.h"
__declspec(dllexport) int myminus(int a, int b) {
  return a - b;
}


5.配置项目属性。因为这是一个动态链接库,所以应在项目属性的“配置属性”下选择“常规”,在其下的配置类型中选择“动态库(.dll)。



6.编译生成新的解决方案,在Debug文件夹下会得到mydll.dll (对象文件库),将该.dll文件、.lib文件和相应头文件给用户,用户就可以使用该库里的函数了。




创建过程中的问题


疑问一:__declspec(dllexport)是什么意思?


动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function)。 导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。


疑问二:动态库的lib文件和静态库的lib文件的区别?


在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质的区别,对一个DLL文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。


动态库的使用


方法一:隐式调用


创建主程序,将mydll.h、mydll.dll和mydll.lib复制到源代码目录下。



将当前项目的目录添加到库目录里面




(P.S:头文件Func.h并不是必需的,只是C++中使用外部函数时,需要先进行声明)

在程序中指定链接引用链接库 :


#pragma comment(lib,"./mydll.lib")


测试程序:


#include<stdio.h>
#include"mydll.h"
#pragma comment(lib,"./mydll.lib")
int main()
{
  printf("调用myminus函数:3-2=%d", myminus(3, 2));
  return 0;
}


运行结果为:



方法二:显式调用


只需拷贝dll文件,编译时什么都不需要,在需要使用dll中的函数时,通过LoadLibrary()和FindProcAdress()这两个API调用。


在需要使用的时候DLL才被占用,使用完毕即被解除占用。DLL中有哪些函数可以通过Depends工具查询。


代码:


#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
int main()
{
  HINSTANCE hDll;           // 声明一个dll实例文件句柄
  hDll = LoadLibrary("mydll.dll");  // 导入动态链接库
  typedef int(*MYFUNC)(int a, int b);
  MYFUNC minus_test;          // 创建函数指针
  // 获取导入函数的函数指针
  minus_test = (MYFUNC)GetProcAddress(hDll, "myminus");
  printf("调用myminus函数:3-2=%d", minus_test(3, 2));
  return 0;
}


运行结果:


相关文章
|
弹性计算 网络协议 网络安全
在Windows Server系统上配置静态IP
在Windows Server系统上配置静态IP的方法
在Windows Server系统上配置静态IP
|
4月前
|
编译器 开发工具 C语言
解锁QtCreator跨界神技!Windows下轻松驾驭OpenCV动态库,让你的跨平台开发如虎添翼,秒变视觉编程大师!
【8月更文挑战第4天】QtCreator是一款强大的跨平台IDE,便于创建多平台应用。本教程教你如何在Windows环境下集成OpenCV库至Qt项目。首先,下载匹配MinGW的OpenCV预编译版并解压。接着,在QtCreator中新建或打开项目,并在.pro文件中添加OpenCV的头文件和库文件路径。确保编译器设置正确。随后编写测试代码,例如加载和显示图片,并进行编译运行。完成这些步骤后,你就能在QtCreator中利用OpenCV进行图像处理开发了。
233 6
|
6月前
|
Windows
windows系统bat批处理 网络设置大全 设置静态、动态IP地址
windows系统bat批处理 网络设置大全 设置静态、动态IP地址
1369 2
|
6月前
|
Windows 计算机视觉 Linux
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
该文档介绍了Qt的跨平台特性,并推荐在Windows和Linux开发中使用QtCreator。在Windows下添加动态库,可以通过Visual Studio配置.lib文件和.dll文件,或在QtCreator中使用&quot;添加库&quot;功能。在QtCreator中,选择库文件、包含路径,并配置Details,然后更新.pro文件,清除、qmake及构建项目。运行时确保.dll与.exe在同一目录下。
192 0
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
|
7月前
|
Linux 开发工具 计算机视觉
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
Qt是跨平台的开发工具,推荐使用QtCreator进行Windows和Linux开发。在Windows下,使用Visual Studio创建动态库时,需要配置.lib文件并确保运行时.dll与.exe在同一目录。在QtCreator中添加DLL动态库,可以通过右键项目,选择添加库,然后在Details界面配置库文件、包含路径和平台,最后更新PRO文件并进行清除、qmake和构建步骤。运行时同样需确保.dll文件与可执行文件在同一目录。
188 5
|
7月前
|
监控 安全 虚拟化
深入浅出:NSSM封装Windows服务工具的使用与介绍
深入浅出:NSSM封装Windows服务工具的使用与介绍
269 3
|
安全 搜索推荐 虚拟化
windows系统封装介绍
windows系统封装介绍
237 0
|
存储 程序员 编译器
windows下的串口编程,串口操作类封装
windows下的串口编程,串口操作类封装
|
Windows
太阳当空照-Windows服务化方式脚本封装sc指令(下)
太阳当空照-Windows服务化方式脚本封装sc指令(下)
112 0
|
Windows
太阳当空照-Windows服务化方式脚本封装sc指令(上)
太阳当空照-Windows服务化方式脚本封装sc指令
149 0