很奇怪,我被告知使用dll文件,您可以对dll进行修改,而无需重新编译使用它的整个应用程序。另一方面,需要编译.lib文件,以便代码可以作为一个链接到应用程序。
所以我知道.lib文件变成了机器码。但是dll怎么样?它们在执行应用程序时会变成机器代码吗?
如果不正确使用,这可能会导致轻松入侵。
答案 0 :(得分:11)
dll仍然是机器代码。它们只是在运行时动态链接(因此然后命名)所以(如果你不更改函数签名),你不必重新编译你的主程序,以便在更改后使用dll。静态库实际上是可执行文件的一部分,这就是为什么需要重新编译(或者实际上是重新链接)的原因。
答案 1 :(得分:7)
DLL do 包含已编译的机器代码。区别在于应用程序EXE和DLL之间的链接是在运行时完成的,而不是在OBJ和LIB文件之间的(传统)链接时间。
答案 2 :(得分:4)
DLL通常包含机器代码。关键不在于您可以修改DLL,因为它是源代码,但您可以修改源代码 for DLL,重新编译和重新链接,并且只要接口仍然存在同样,您可以用新的DLL替换旧的DLL,而应用程序的其余部分可以使用new而不是旧的。
实际上,这经常导致问题,例如包含依赖的代码的应用程序在旧DLL中的错误。当/如果您创建修复错误的版本时,它会破坏应用程序。谷歌为“DLL地狱”提供更多例子。
答案 3 :(得分:1)
简单地说:DLL可以在编译后换出,因为它们与你的exe在物理上是分开的。另一方面,Lib和obj文件是 编译到你的exe中,以便更新它们 需要重新编译您的应用程序。
Dlls实际上是exes,没有定义main()。
答案 4 :(得分:0)
当DLL链接到主程序时,只有它导出的接口,即类,函数等通过它们的签名链接。 DLL中的实际机器代码仅在运行时加载,而不是在编译时加载;这就是为什么你可以用DLL的lib构建你的应用程序,并将实际的DLL放在你想要的地方(例如一些共享的DLL文件夹或其他)。
然后,您可以将此DLL与具有相同接口的任何其他DLL交换出来。这就是插件系统通常如何工作,因为每个插件只是一个符合文档预定义接口的DLL,程序只是加载它在某些“插件”目录中找到的该接口的所有DLL。
这里(可能)令人困惑的部分是有效的两种.lib文件:
a)用于静态链接的库。这些将所有已编译的代码直接放入主应用程序中,并且是生成的.exe文件的固定部分。
b)用于动态链接的库。它们包含一个包含实际代码的DLL的接口,该代码必须仅在运行时才可用于应用程序(如果不是,它将无法启动,只是告诉您找不到哪个DLL)。 / p>
顺便说一下:您不必指定链接到哪个库是哪种类型,它会自动执行。
此外:某些应用程序构建为DLL,旨在在某些外部环境中运行。例如,Webservices被实现为具有特定接口的DLL,其中由Apache / IISAPI /任何服务器运行。这与前面提到的插件系统类似,但是这里的每个DLL实际上都是应用程序。