利用静态链接库/动态链接库达到对源代码封装的问题。
使用的是VC++6.0软件
以一个加法程序为例。
静态链接库创建步骤:
1.工程文件创建静态链接库工程;
2.添加头文件;
3.添加头文件的实现;
4.编译后,(注意没有建立调用头文件的主函数,因此执行时会出现一个对话框)可以在debug文件中发现一个.lib文件,就是头文件的实现的源代码文件——静态链接库文件。
5.重新建立工程,调用头文件就可以了。
但是,调用头文件出现了问题,仅仅是调用了头文件,编译出现了错误。原因是因为main.c文件和头文件没有在同一个文件中。需要引入相对路径。
引入后的文件编译成功,连接时出现了这个问题,原因是因为没有找到头文件的实现。
这里需要引入一个预处理指令#pragma,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma comment(comment-type,["commentstring"])
comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。
commentstring 是一个为comment-type提供附加信息的字符串。
常用lib关键字,可以帮我们连入一个库文件。
这样就可以正常执行文件了。
这样就实现了静态链接库对源码的封装,给其他程序提供.h和.lib文件,就可以使用函数功能了。
PS.另外一种放置.lib文件的方法:
1.工具-选项-目录-Include files-新建-选中需要的头文件目录即可
2.库文件也可以这样设定。
3.不使用#pragma:工程-设置-链接-对象库/模块中加入.lib文件即可。(注意.lib文件之间要有空格)
动态链接库创建步骤:
1.创建动态链接库,
2.创建头文件和静态有区别,需要加上__declspec(dllexport),此修饰符将一个函数声明为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。
3.编写头文件函数的实现,然后编译链接。
4.在工程debug文件中会发现.lib和.dll文件。这里,.lib文件的处理和静态一样,.dll文件需要拷贝到主函数所在的debug文件夹中。
在动态链接库里面,头文件的实现不是在.lib文件中,而是在.dll文件中。
静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。
动态lib相当于一个.h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时需要相应的.dll文件支持。
PS.动态链接库的.dll文件并不一定要和.exe同一个文件中,windows应用程序调用动态链接库,系统会按照一定的顺序在某几个目录中查找,Windows搜索DLL的顺序。
1)当前进程的可执行模块所在的目录;
2)当前目录;
3)Windows系统目录,通过GetSystemDirectory函数可获得此目录的路径;
如:c:\Windows\System32
c:\Windows\SysWow64 // 6位机器,32位dll
4)Windows目录,通过GetSystemDirectory函数可获得此目录的路径;
5)PATH环境变量中的目录
(计算机-右击-属性-高级系统设置-环境变量-系统变量中有PATH)
静态库(lib)VS 动态库(dll)
1.静态库会显著增加exe模块的体积;
2.dll独立于编程语言,大多数Windows编程环境都允许主程序调用DLL中的函数;
3.exe模块调用动态库的到处函数时,需要先加载DLL,有一定的性能损失;
4.静态库可以避免运行程序的系统缺少DLL或DLL地域问题造成程序无法正常运行。