.lib 和 .a 文件有啥区别?

Posted

技术标签:

【中文标题】.lib 和 .a 文件有啥区别?【英文标题】:What's the difference between .lib and .a files?.lib 和 .a 文件有什么区别? 【发布时间】:2010-02-25 21:55:34 【问题描述】:

我正在尝试静态编译一些东西,并且我正在尝试了解所有这些依赖项是什么。我知道 .dll 文件是用于最终输出所需的动态链接依赖项,但是 .a 和 .lib 文件是什么,你什么时候需要这些文件?

【问题讨论】:

【参考方案1】:

.a 是代码存档:已编译但未链接。您将在程序的最后一个链接步骤中与它进行静态链接。

.lib 可以与 .a 相同,也可以是一个神奇的所谓“导入库”:一个薄占位符,它会导致您在运行时需要一个 .dll。

【讨论】:

我正在使用 .a OpenSSL 库编译 QT 框架,但不知何故,我由 QT 生成的最终可执行文件仍然需要外部 OpenSSL dll 才能运行。鉴于我使用的是 .a 库,您知道怎么会是这种情况吗? OpenSSL .a 的内容是如何编译的?你如何链接你的最终可执行文件? 我不确定“在运行时需要 .dll”。如果您的项目使用 .lib 静态库,则不需要 .dll(除非存在您未正确识别的 .dll 依赖项)。【参考方案2】:

在 Unix 系统上,您有 .a 文件。这些是目标文件的简单存档 (.o)。

在 Windows 上,有 .lib 文件,它们完全一样,但适用于 Windows 而不是 Unix。

另一个微妙之处是,为了将一些代码链接到 DLL(在 Windows 上),您必须链接到一个 .lib 文件,该文件包含调用 DLL 的简单包装器。在 Unix 系统上,传统上不需要这样的包装器(链接器足够聪明,可以即时生成它们)。

【讨论】:

感谢您的回答,发现我正在尝试在某处使用 Windows 标志进行编译! :) windows和unix创建的.a有区别吗? 我这里有一个示例,不需要在 Windows 中的共享 (.dll) 库上使用 .lib:github.com/ConsoleTVs/C_Static_Shared_Libraries【参考方案3】:

我没有看到这里提到的令人惊讶的事实是,至少在某些时候,.a 文件和 .lib 文件实际上是相同的二进制格式。虽然我在 mingw 网站上找不到任何内容,但我注意到当试图让 MS Visual C++ 的 64 位编译器 cl.exe 链接到使用 mingw-w64 g++ 编译器生成的 .dll 文件时,它很高兴接受命令行

cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a

只要我将相应 .dll 文件的副本放在当前目录中,生成的 .exe 文件就会正确运行。 (它确实咕哝了警告“命令行警告 D9024:无法识别的源文件类型 'path\to\lib\gmp-6.0.0\lib\libgmp.dll.a',假定目标文件”。)

进一步的证据是 Linux file 命令为我尝试的每个扩展名(.lib 或 .a)的多个文件报告了“当前 ar 存档”。

【讨论】:

【参考方案4】:

通常,.a 用于 Linux 下的静态库,而 .lib 用于相同但在 Windows 上。当然,这只是一个约定。

【讨论】:

以上是关于.lib 和 .a 文件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

.LIB 和 .OBJ 文件有啥区别? (Visual Studio C++)

dexedLibs 和 libs 有啥区别?

各位,工程下libs文件夹与Android Private Libraries有啥区别

jdk1.6.0_02\jre\lib\ext和jre1.6.0_02\lib\ext有啥区别?

BeautifulSoup:“lxml”、“html.parser”和“html5lib”解析器有啥区别?

OpenCV 中的 vc10、vc11 和 vc12 库有啥区别?