47

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

4

4 回答 4

52

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

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

于 2010-02-25T22:02:34.947 回答
34

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

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

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

于 2010-02-25T22:01:13.923 回答
8

我还没有看到这里提到的令人惊讶的事实是,至少在某些时候,.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',假定目标文件”。)

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

于 2014-06-13T00:22:16.093 回答
6

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

于 2010-02-25T22:01:13.293 回答