【问题标题】:Difference between *.a and *.dll on WindowsWindows 上 *.a 和 *.dll 的区别
【发布时间】:2011-01-09 11:20:38
【问题描述】:

*.a*.dll 在 Windows 上的区别是什么?据我了解,可以将所有 *.o 文件打包到 *.a 中,这是其他应用程序可以在 Linux 上使用的可分发文件。

但是*.a*.dll 之间有什么区别?它们可以互换吗?如果我的应用需要链接到*.a,我可以链接到*.dll吗?

【问题讨论】:

    标签: assemblies


    【解决方案1】:

    除此之外:没有定义 *.a 格式的普通 Windows 开发工具,除非您使用基于 Linux 的工具链。您可能指的是静态库,也就是 Windows 中的 .lib。

    DLL 相当于 Unix 上的共享库 (*.so),不,如果链接器希望您链接到静态库,您通常无法链接到共享库/dll。

    【讨论】:

    • 共享对象库在 Linux 下有一个 *.so 扩展名,即使这不是真正的突发新闻,也许也值得一提:-P
    • 但是可以从dll中提取静态库,然后链接到提取的库。
    【解决方案2】:

    在带有 gcc 的 Linux 下,您将看到两种文件,存档 *.a(用于提供一组静态链接的函数)和*.so,即所谓的共享对象库(动态链接)。对于大多数编译器来说,它们在 windows 下的等价物是 *.lib*.dll

    所以*.a*.dll 根本不能互换。此外,您在 Windows 下遇到的困境是 *.lib 既可用于静态链接,也可用于动态链接(具有固定地址)。另一种方法是使用GetProcAddress 完全动态绑定,但如果您想让 dll 用于不同的版本,则可能需要创建包装器的开销。

    您可能会认出静态库的大小,与用于动态链接的库相比,它们是巨大的。在我的项目中,我真的经常使用GetProcAddress,因为我喜欢只需为旧应用程序放入全新的 DLL 而无需再次链接所有内容的能力。

    【讨论】:

    • 没有理由静态库必须大于动态库。不过,使用静态库的应用程序通常会更大。
    • 我的意思是用于 dll 链接的 lib 文件仅包含函数的地址,但静态库包含所有内容。可能不清楚我是在比较 lib 文件而不是 dll 与相应的 lib。问候,雅普
    【解决方案3】:

    看到 *.a 是 Linux 静态库,它们根本不能与 windows .dll(动态链接库)互换,因为它们具有完全不同的格式。如果您的应用程序需要链接到您创建的 .a,您将需要将生成您的 linux 静态库(如果可能)的源代码重新编译到 Windows 静态库 (.lib) 中,并针对它编译您的代码。

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2015-03-07
      相关资源
      最近更新 更多