2010-02-25 982 views
29

我想静态编译的东西,我试图得到所有这些依赖关系的处理。我知道.dll文件适用于最终输出需要的动态链接依赖关系,但.a和.lib文件是什么,以及什么时候需要这些文件?.lib和.a文件有什么区别?

回答

28

.a是代码存档:已编译但未链接。在程序的最终链接步骤中,您可以静态链接它。

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

+0

我正在用.a OpenSSL库编译QT框架,但不知何故,QT生成的最终可执行文件仍需要外部OpenSSL dll才能运行。你有什么想法,因为我正在使用.a库,情况如何? – Nantucket 2010-02-26 00:09:00

+0

如何编译OpenSSL .a的内容? 你如何链接你的最终可执行文件? – crazyscot 2010-02-26 08:52:54

+0

我不确定“在运行时需要.dll”。如果您的项目使用.lib静态库(除非存在未正确识别的.dll依赖项),则不需要.dll。 – ha9u63ar 2014-08-26 07:10:52

4

通常,.A是Linux下的静态库,而的.lib是相同的,但在Windows上。但当然这只是一个惯例。

19

在Unix系统上,您有.a文件。这些是对象文件的简单归档文件(.o)。

在Windows上,有.lib文件,这些文件是完全相同的,但是对于Windows而不是Unix。

一个额外的细节是,为了链接一些代码与DLL(在Windows上),你必须链接到一个.lib文件,其中包含调用该DLL的简单包装。在Unix系统上,传统上不需要这样的包装(链接器足够聪明,可以随时生成它们)。

+0

谢谢你的回答,发现我试图用Windows标志在某处编译! :) – 2012-12-04 21:56:37

+0

在windows和unix中创建的.a有没有区别? – samnaction 2017-01-17 12:15:56

5

我在这里没有看到的东西还有一个令人惊讶的事实,即至少在某些时候,.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 

所得.exe文件,因为我把相应的.dll文件的副本在当前目录正确地尽快跑。 (它确实咕哝了警告。 “命令行警告D9024:无法识别的源文件类型 '路径\到\ LIB \ GMP-6.0.0 \ LIB \ libgmp.dll.a',对象文件假定”)

进一步的证据是Linux file命令为我试过的每个扩展名(.lib或.a)的几个文件报告“current ar archive”。

相关问题