windows应用程序【三】静态链接库和动态链接库

版权声明:欢迎转载请注明转自方辰昱的博客https://blog.csdn.net/viafcccy https://blog.csdn.net/viafcccy/article/details/85273810

在写c语言程序时,我们会调用头文件 呢么头文件理论上一定有实现方法 我们可以去查看头文件一般在你安装vc目录下的/vc98/include 来看一下windows.h

但是我们发现windows.h中只是一些定义与声明 呢么我们再来看windows.h的头文件

我们打开winuser 查找messagebox

我们可以发现有许多messagebox 但是还是找不到实现的方法

其实原因很简单 这些windows.h头文件的大多数函数是与操作系统交流的 如果我们可以看到这些就可以轻易的了解操作系统的底层 但是微软肯定不想我们这样做 于是产生了.lib也就是连接库 将实现方法封装在其中 只留出接口供我们调用

下面我们来写一个静态库来把它调用起来

创建头文件声明变量 

创建c语言文件去实现add也就是加法函数 然后我们编译链接执行

这是因为我们没有入口函数需要去寻找入口 但是我们可以看到已经产生了.lib文件

 现在我们已经将函数全部封装起来了 现在我们来在创建一个工程进行调用

现在我们添加一个新的工程

此时出现报错 原因是编译器不知道去哪里找这个头文件

但是stdio却能知道去哪里找 因为这些头文件是已经规定好路径的 

可以在这里添加入你的头文件的路径 也可以如图输入路径

此时可以编译通过 却无法执行 这是因为我们没有将链接库文件 和我们的代码联系起来

 在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。 #pragma comment( comment-type ,["commentstring"] ) comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。 commentstring是一个提供为comment-type提供附加信息的字符串。 常用的lib关键字,可以帮我们连入一个库文件

于是加入

 

下面来看动态库

因为不同的程序需要的.lib肯定会有一部分重因此我们就需要去动态链接库 去调用相同的代码

__declspec(dllexport)

此修饰符将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。

其实与创建静态库的创建过程一样 只是需要在这里改为 这样去写头文件

但是此时文件会生成.lib 和 .dll 但是在动态库中函数的内容实际是在.dll中 .lib只是一个索引的作用

 动态lib & 静态lib

静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序 动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持

Windows搜索DLL的顺序

(1)当前进程的可执行模块所在的目录; (2)当前目录; (3)Windows 系统目录,通过GetSystemDirectory 函数可获得此目录的路径;    C:\Windows\System32    C:\Windows\SysWow64 //64位机器,32位dll (4)Windows 目录,通过GetWindowsDirectory 函数可获得此目录的路径; (5)PATH 环境变量中列出的目录。 

MessageBox在哪?

大部分Windows API 都在下面几个DLL当中: KERNEL32.DLL ---- 低级内核函数。使用他可以完成内存管理、任务管理、资源控制等。 USER32.DLL------于windows管理有关的函数。消息、菜单、光标、计时器、通信和其他大多数非现实函数都可以从这里找到 GDI32.DLL-------图形设备接口库。于设备输出有关的函数:大多数绘图、显示场景、图元文件、坐标及其字体函数都可以从这里找到。 

静态库(lib) VS 动态库(dll)

静态库会显著增加exe模块的体积; DLL独立于编程语言,大多数windows编程环境都允许主程序调用DLL中的函数; exe模块调用动态库的导出函数时,需要先加载DLL,有一定的性能损失; 静态库可以避免运行程序的系统缺少DLL或DLL地狱问题造成程序无法正常运行 

猜你喜欢

转载自blog.csdn.net/viafcccy/article/details/85273810
今日推荐