标签:http ar os 使用 sp strong 文件 数据 on
selected from: http://topic.csdn.net/t/20020927/11/1057549.html
问题:
一直没搞清楚编译dll后生成的lib文件到底是干什么用的?如果采用静态连接,为什么老是需要lib文件?而通过loadlibrary则不需要?如果是静态连接,是否我的dll程序一旦改动而从新编译过后,就还需要从新编译调用dll的程序?
答案汇总:
(rivershan)
程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。
当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中。可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。
(stonespace)
调用dll的export函数是不需要lib的,dll本身就是和lib同一个级别的东西,也提供类似的功能,调用dll函数只需要loadlibrary就行,但是你也发现,用loadlibrary很麻烦,要取出函数的地址,然后还要定义一个调用的原型。用dll比用静态链接库lib要麻烦得多。
微软为了解决这个问题,在编译dll的时候,顺便生成一个引入库lib文件,这个lib不包含实际功能代码,只不过用来帮你做那些loadlibrary的麻烦工作,让你用dll和用一般的lib一样方便。
dll改过之后,只要export函数的声明没有修改,也就是参数、函数名、返回值没有发生变化,调用代码不需要重新编译。不过export函数声明修改过就必须重编译。
(alphapiao)
使用动态dll有两种方法,一种是隐式链接,一种显示链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接
标签:http ar os 使用 sp strong 文件 数据 on
原文地址:http://www.cnblogs.com/Bonker/p/4123431.html