1.lib与dll 区别
(1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。
lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。
如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。
如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。
静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。
但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,
引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使
用的DLL文件,库中的函数和数据并不复制到可执行文件中,
因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,
这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。
从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
(4).dll用于运行阶段,如调用SetWindowText()函数等,需要在user32.dll中找到该函数。
DLL可以简单认为是一种包含供别人调用的函数和资源的可执行文件。
.lib用于链接阶段,在链接各部分目标文件(通常为.obj)到可执行文件(通常为.exe)过程中,
需要在.lib文件中查找动态调用函数(一般为DLL中的函数)的地址信息,此时需要在lib文件中查找,
2 . LIB文件的制作与使用
在程序编译链接过程中,如果涉及到的文件比较少,我们只需要相应的头文件(h)和源文件(cpp/c)即可,但是如果文件成千上万,这样效率就会很低下,此时就会用库文件(lib)来解决。将部分源文件预先编译成库文件,也即lib文件, 当要使用其中的函数时,只需要链接lib文件就可以了,而不用再理会最初的源文件。例如在VC中新建一个static library类型的工程,hello.cpp是我们需要的源文件,其中包含大量函数实现。要想加入hello.cpp文件,就应该编译,就生成了lib文件,假设文件名为hello.lib。别的工程要使用这个lib有两种方式:(1) 在工程选项-〉link-〉Object/Library Module中加入hello.lib(2) 可以在源代码中加入一行指令#pragma comment(lib, "hello.lib")
注:这属于静态库工程,所以,在编译这种静态库工程时,你根本不会遇到链接错误。即使有错,错误也只会在使用这个lib的EXE或者DLL工程中暴露出来。
3 .DLL原理与使用
一个DLL工程和一个EXE工程的差别有两点:
1 EXE的入口函数是main或者WinMain,而DLL的入口函数是DllMain
2 EXE的入口函数标志着一段处理流程的开始,函数退出后,流程处理就结束了,而DLL的入口函数对系统来说,只是路过,加载DLL的时候路过一次,卸载DLL的时候又路过一次[2],你可以在DLL入口函数中做流程处理,但这通常不是DLL的目的,DLL的目的是要导出函数供其它DLL或EXE使用。
如何写一个DLL以及如何导出函数,应该先尝试用VC创建一个新的动态链接库工程,创建时选项不选空工程就可以了, 这样你能得到一个示例,以便开始在这个例子基础上工作。
4. 动态链接库与静态链接库
动态链接与静态链接的不同之处在于:动态链接允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL函数的可执行代码所需的信息。
在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。 使用动态链接代替静态链接有若干优点。DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展 MFC 库类的机制。