【发布时间】:2011-01-09 11:20:38
【问题描述】:
*.a 和 *.dll 在 Windows 上的区别是什么?据我了解,可以将所有 *.o 文件打包到 *.a 中,这是其他应用程序可以在 Linux 上使用的可分发文件。
但是*.a 和*.dll 之间有什么区别?它们可以互换吗?如果我的应用需要链接到*.a,我可以链接到*.dll吗?
【问题讨论】:
标签: assemblies
*.a 和 *.dll 在 Windows 上的区别是什么?据我了解,可以将所有 *.o 文件打包到 *.a 中,这是其他应用程序可以在 Linux 上使用的可分发文件。
但是*.a 和*.dll 之间有什么区别?它们可以互换吗?如果我的应用需要链接到*.a,我可以链接到*.dll吗?
【问题讨论】:
标签: assemblies
除此之外:没有定义 *.a 格式的普通 Windows 开发工具,除非您使用基于 Linux 的工具链。您可能指的是静态库,也就是 Windows 中的 .lib。
DLL 相当于 Unix 上的共享库 (*.so),不,如果链接器希望您链接到静态库,您通常无法链接到共享库/dll。
【讨论】:
*.so 扩展名,即使这不是真正的突发新闻,也许也值得一提:-P
在带有 gcc 的 Linux 下,您将看到两种文件,存档 *.a(用于提供一组静态链接的函数)和*.so,即所谓的共享对象库(动态链接)。对于大多数编译器来说,它们在 windows 下的等价物是 *.lib 和 *.dll。
所以*.a 和*.dll 根本不能互换。此外,您在 Windows 下遇到的困境是 *.lib 既可用于静态链接,也可用于动态链接(具有固定地址)。另一种方法是使用GetProcAddress 完全动态绑定,但如果您想让 dll 用于不同的版本,则可能需要创建包装器的开销。
您可能会认出静态库的大小,与用于动态链接的库相比,它们是巨大的。在我的项目中,我真的经常使用GetProcAddress,因为我喜欢只需为旧应用程序放入全新的 DLL 而无需再次链接所有内容的能力。
【讨论】:
看到 *.a 是 Linux 静态库,它们根本不能与 windows .dll(动态链接库)互换,因为它们具有完全不同的格式。如果您的应用程序需要链接到您创建的 .a,您将需要将生成您的 linux 静态库(如果可能)的源代码重新编译到 Windows 静态库 (.lib) 中,并针对它编译您的代码。
【讨论】: