A. 关于c语言 dll文件和lib文件的问题
静态链接 lib文件的二进制代码最终要链接植入你的exe中
动态链接 dll文件内的二进制代码不会植入你的exe中
静态编译 如果lib文件 的源码修改了 编译生成新的lib文件 那么
新的lib文件要和你的源码编译得到的obj文件重新链接生成 新的exe
之前的exe就可以扔进回收站了
动态编译 dll 的源码修改了 重新编译生成新的dll (dll的调用接口 保持不变)
你的源文件编译 obj文件后链接生成exe exe是动态链接调用dll 的所以 你的源码不需要重编译 你的exe依然可以用,你要做的只是 过来替换一下 n个dll中发生变动的那k个 ,
B. 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文件必须随应用程序一起发行,否则应用程序将会产生错误。
C. LIB和DLL的区别与使用
第一:.DLL是动态链接库,而.LIB是静态链接库
dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, 如果调用lib中的函数,在工程编译时,这些调用的函数都将参加编译.
第二:从内存管理的角度来看,lib必须被链接到主程序中,主程序进入内存,lib也同时进入内存。而dll则是需要用到它的时候由操作系统调入内存。从复用性的角度来看,lib因为必须参加编译,所以复用性就不如DLL
D. 有的程序为何只有dll没有lib
首先,dll的调用不一定需要*.lib这个引入库。
dll调用分为两种方式,一是隐式链接,二是显式链接。隐式链接就是使用*.lib的,这就需要在编译的时候有这个lib文件。而显式链接,就是使用LoadLibrary这个API函数来实现动态加载,因此,不需要lib这样的引入库。
再者,就算是使用隐式链接,lib只是在编译的时候确定DLL接口,使得调用者可以很便捷地使用dll文件,但在发布的时候,是不需要连同lib一起发布。
如果你要发布一个dll形式的SDK,就很有必要将头文件,dll文件连同引入库一起发布,以方便使用者调用。
E. C++中lib 和 dll 的区别,生成以及使用详解
首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。
静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件
动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件
那么上述静态库和动态库中的lib有什么区别呢?
静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中
动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供
总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
F. 电脑不在身边,看书看得不是明白,是不是dll文件其实不需要.lib文件,只带一个.h也能分发到别人的项目里
其实就是没有lib,没有h,一个dll文件也是可以给别人使用的,就是用起来麻烦些,LoadLibrary,定义函数指针,再GetProcAddress,一样没问题的。
G. dll库和lib库有什么区别
关于dll库和lib库的区别如下:
1、使用场景不同:lib是编译时用到的,dll是运行时用到的。
如果要完成源代码的编译,只需要 lib;如果要使动态链接的程序运行起来,只需要dll。
2、用途不同:如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位 置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。
使用静态编译的lib文件,在运行程序时 不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才可以。
3、应用对象不同:动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL 文件。
在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。
DLL和LIB文件必须随应用程序 一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
(7)dll编译需要lib吗扩展阅读:
dll库和lib库使用方法:
1、使用lib的方法:
静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。在编译这种静态库工程时,不会遇到链接错误;即使有错,也只会在使用这个lib的EXT文件或者DLL工程里暴露出来。
在VC中新建一个static library类型的工程Lib,加入test.cpp文件和test.h文件(头文件内包括函数声明),然后编译,就生成了Lib.lib文件。
2、使用dll的方法:
使用动态链接中的lib,不是obj文件的集合,即里面不会有实际的实现,它只是提供动态链接到DLL所需要的信息,这种lib可以在编译一个DLL工程时由编译器生成。
参考资料来源:网络—lib
参考资料来源:网络—dll
H. 对话框程序生成的exe,为什么不需要lib dll也能运行
Use MFC as Static
MFC基础问题,lib是编译到exe中的,所以使用静态库,就不需要MFC支持文件了。
不是只有对话框程序,文档视图结构的也一样。
I. 如何由dll文件生成lib文件
编号: QA004062�0�2�0�2�0�2�0�2�0�2所属类别: C/C++ - 其他方面
�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 操作系统:windows
�0�2�0�2�0�2 编程工具:visual c++
�0�2�0�2�0�2 水平:刚入门(yijiong shi)�0�2
�0�2�0�2�0�2
�0�2�0�2�0�2�0�2 .lib有两种,一种是静态的,其中包括函数的实际代码,
一种是由DLL生成的.lib,其中并不包含代码,
只是包含DLL的链接信息。只有前一种才存在你说的转换问题。
另外一点要看.lib中的内容,如果是普通的C语言函数,
可以转换,如果是C++类,则不能直接转换为DLL,
因为即使你直接编译为DLL,也只有VC的程序才能使用(
那何必费这事),即使C++ Builder也不能调用,你必须把类转换为普通的C语言函数,
你可以参考QA000072 VB和VC混合编程中编写DLL的方法。
J. 编译dll为什么没有lib文件产生
动态库编译完之后是要一个exe和这个dll同时在才能运行。好处?dll可以动态加载,也可以被多个程序调用,lib库存在版本必须一致的问题,例如2008的代码连接的时候必须要连接2008编译出来的lib库,而dll或许不需要这么强制对应。