静态库与Windows平台导入库

Posted

技术标签:

【中文标题】静态库与Windows平台导入库【英文标题】:static library v.s. import library on Windows platform 【发布时间】:2011-11-05 10:05:57 【问题描述】:

我怎么知道一个 .lib 文件是静态库还是静态库? DLL 的导入库?是否有任何工具或命令可以做到这一点?

第二个问题是如何检查静态库的依赖关系,我的意思是我如何知道这个静态库中包含哪些 DLL?

感谢您的帮助。

最好的问候,

【问题讨论】:

该信息将与 .lib 文件一起提供 如果您没有这样的线索,那么您确实想使用该库。联系代码所有者并询问支持选项。 请注意,静态库和导入库只是频谱中的两个极值。你也可以有一个混合的静态/导入库。 关于您的第二个问题:您的意思是静态库中包含哪些DLL,还是静态库依赖于哪些DLL? 【参考方案1】:

导入库将为您的程序添加一个 DLL 依赖项。如果您没有 DLL,您的程序将无法启动。 (您可以使用Dependency Walker 来获取程序所依赖的DLL 的名称)。

Afaik 静态库没有依赖项。它们链接到程序中,只有链接器错误会告诉您该特定库是否依赖于另一个库。 (至少在 GCC 中,我不知道想要的是 MS 工具的行为。)

【讨论】:

对此进行扩展:将静态库与一个普通程序链接,然后使用 Dependency Walker 查找任何新的 DLL 依赖项。 静态库通常至少对基本系统库(ntdll.dll 等)具有 DLL 依赖关系,并且可能还具有对语言运行时的依赖关系,例如 msvcrt.dll。【参考方案2】:

仅给定一个wtf.lib 文件,问题是确定这个库文件是static library 还是import library。我目前的做法是(通过 DOS 提示符和 cygwin bash shell 的组合)。

在需要正确运行dumpbin.exe的DOS提示符下:

dumpbin -all wtf.lib > wtf.lib.txt

然后,在 cygwin shell 中:

grep 'Archive member name' wtf.lib.txt

如果grep 的输出输出一个DLL 文件名,那么wtf.lib 就是import library。否则,它是一个独立的static library

【讨论】:

我必须发誓并承认这里找到了更优秀的答案:***.com/questions/6402586/…

以上是关于静态库与Windows平台导入库的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 中将 VS2005 静态库与 gcc 链接

动态库与静态库的区别在windows及linux环境下的制作及用法

浅谈Windows平台下C++调用静态链接库的方式

浅谈Windows平台下C++调用静态链接库的方式

JNI编程实现(Windows)

C语言的printf函数在windows平台的系统调用过程是啥样的?