我正在尝试静态编译某些内容,而我正在尝试处理所有这些依赖项。我知道.dll文件是针对最终输出所需的动态链接依赖项,但是什么是.a和.lib文件,什么时候需要每个文件?
答案 0 :(得分:39)
.a是代码存档:已编译但未链接。您可以在程序的最终链接步骤中静态链接它。
.lib可以与.a相同,也可以是一个神奇的所谓“导入库”:一个瘦占位符,它会导致您在运行时需要.dll。
答案 1 :(得分:21)
在Unix系统上,您拥有.a
个文件。这些是目标文件的简单归档(.o
)。
在Windows上,有.lib
个文件,这些文件完全相同,但是对于Windows而不是Unix。
另一个细微之处在于,为了将某些代码与DLL(在Windows上)链接起来,您必须链接到.lib
文件,该文件包含调用DLL的简单包装器。在Unix系统上,传统上不需要这样的包装器(链接器足够智能,可以动态生成它们)。
答案 2 :(得分:6)
我还没有看到这里提到的一些令人惊讶的事实,至少在某些时候,.a文件和.lib文件实际上是相同的二进制格式。虽然我在mingw网站上找不到任何说法,但我注意到在尝试使用MS Visual C ++的64位编译器cl.exe链接到使用的.dll文件时在mingw-w64 g ++编译器中,它很高兴地接受了命令行
cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a
,一旦我将相应的.dll文件的副本放在当前目录中,生成的.exe文件就会正确运行。 (它确实嘟the了警告"命令行警告D9024:无法识别的源文件类型'路径\到\ lib \ gmp-6.0.0 \ lib \ libgmp.dll.a',假设对象文件&# 34。)
进一步的证据是Linux file
命令报告了当前的ar存档"对于每个扩展名的几个文件(.lib或.a),我试过了。
答案 3 :(得分:4)
通常, .a 适用于Linux下的静态库,而 .lib 适用于Windows上的静态库。但当然这只是一个惯例。