.h头文件 .lib动态链接库文件 .dll 动态链接库
dllarchiveimport(1).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。附加依赖项的是.lib 不是.dll若生成了DLL ,则肯定也生成 LIB文件如果要完成源代码的编译和链接,有头文件和lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。.h .lib .dll三者
(1).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
附加依赖项的是.lib 不是.dll 若生成了DLL ,则肯定也生成 LIB文件
如果要完成源代码的编译和链接,有头文件和lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
.h .lib .dll三者的关系是:
H文件 作用是:声明函数接口 DLL文件 作用是: 函数可执行代码 当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢? 这就是LIB 文件的作用: 告诉链接器 调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置 这也就是为什么需要 附加依赖项 .LIB文件 ,它起到桥梁的作用。 如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中 目前以lib后缀的库有两种,一种为静态链接库 (Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库 (Import Libary,以下简称“导入库”)。 静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。 动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。 导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,而一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
在VS2008中添加.LIB文件
法一:在project属性->链接器->输入->附加依赖项
在以上路径加入即可,多个lib名用空格隔开
法二:直接在代码中表现:
#pragma comment(lib,"winmm.lib") // 加入winmm.lib库
注:
静态库和共享库都是一个obj文件的集合 ,但静态链接后,执行程序中存在自己所需obj的一份拷贝,而动态链接后,执行程序仅仅是包含对共享库的一个引用。共享库相当于一个由多个obj文件组合而成的obj文件,在链接后其所有代码被加载,不管需要的还是不需要的。
似乎可以得出一个结论:
静态链接后的程序比动态链接的所用存储空间大,因为执行程序中包含了库中代码拷贝(只拷贝了自己需要的部分);
而动态链接的程序比静态链接的所用的运行空间大,因为它将不需要的代码也加载到运行空间(拷贝了整个dll)。
LIB与DLL文件的区别
DLL是一个完整的程序,称为“动态链接库”,DLL中包含的主要有三块内容:1.全部变量 2.函数接口 3.资源;DLL中有一个函数导出表,其中每一项都是一个函数名称。通过一定的方式连接这些函数接口,来调用这些函数的功能。
dll有两种加载方式:隐式链接和显式链接。
dll一般会有对应的导入库,方便程序进行隐式链接加载,否则就需要自己LoadLibary调入DLL文件,然后再GetProcAddress获得对应函数了(即显示链接加载dll方式)。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
DLL中的代码在程序主动调用的时候才会被调入内存(DLL没有自己的内存,它会被分配到调用程序的内存区域中)。
静态库只有用到的部分,才在链接的时候链接到目标代码中。(http://bbs.csdn.net/topics/80090629四楼)
来源:http://blog.csdn.net/c395565746c/article/details/5402239
http://blog.csdn.net/digu/article/details/5576892
http://www.cnblogs.com/haoyuanyuan/p/3793036.html
参考http://www.reader8.cn/jiaocheng/20131013/1876826.html
同时可以参考:
1、http://liuleijsjx.iteye.com/blog/428688中:
“静态链接方法:#pragma comment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的代码或代码的地址确定下来
静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库
动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开 始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态 代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。”
2、http://www.360doc.com/content/11/0527/15/1861654_119780753.shtml中关于windows API的介绍
4、http://baike.baidu.com/view/4541016.htm最后关于dll和lib的介绍
5、以及http://www.cnblogs.com/AI-Algorithms/p/3725696.html后面的示例。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)