我正在尝试静态编译一些东西,我正在尝试处理所有这些依赖项.我知道.dll文件是针对最终输出所需的动态链接依赖项,但是什么是.a和.lib文件,什么时候需要每个文件?
cra*_*cot 41
.a是代码存档:已编译但未链接.在程序的最后一个链接步骤中,您将静态链接它.
.lib可以与.a相同,也可以是一个神奇的所谓"导入库":一个瘦占位符,它会导致您在运行时需要.dll.
Tho*_*nin 24
在Unix系统上你有.a文件.这些是对象文件的简单归档(.o).
在Windows上,有些.lib文件完全相同,但是对于Windows而不是Unix.
另一个细微之处在于,为了将某些代码与DLL(在Windows上)链接起来,您必须链接一个.lib包含调用DLL的简单包装器的文件.在Unix系统上,传统上不需要这样的包装器(链接器足够智能,可以动态生成它们).
我在这里没有看到的东西是令人惊讶的事实,至少在某些时候,.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
Run Code Online (Sandbox Code Playgroud)
一旦我将相应的.dll文件的副本放在当前目录中,生成的.exe文件就会正确运行.(它确实混淆了警告"命令行警告D9024:无法识别的源文件类型'path\to\lib\gmp-6.0.0\lib\libgmp.dll.a',假定对象文件".)
进一步的证据是Linux file命令报告了我试过的每个扩展名(.lib或.a)的几个文件的"当前ar存档".