检查运行时静态库或dll使用了哪个。

11

Windows SDK中是否有工具可用于检查库使用的CRT版本?例如,我有一个*.lib文件,如何检查它是否使用/MDd标志或/MT标志进行编译?同样,如何检查DLL或EXE文件的情况?可以使用dumpbin完成此操作吗?

1个回答

17
如果是一个.lib文件,即静态链接库,那么你还不知道CRT的任何信息。因为它尚未被链接。你可以查看.lib文件来了解原始程序员的意图,使用十六进制查看器,例如Notepad就可以。你会看到用于编译嵌入在.lib文件中的.obj文件的原始命令行。只需搜索"cl.exe",你就可以从cl.exe的路径得知使用了哪个编译器版本。并且你可以看到命令行选项,因此你将知道/MD或/MT是否生效。而/O选项,则很重要,以便判断你是否拥有调试或发布版本的构建。
如果是.dll文件,则dumpbin.exe /imports是最佳选择。msvrcxxx.dll文件的依赖关系将可见,其中xxx表示版本号,例如“120”。如果看到它,名称将告诉你是否使用了/MD或/MDd,对于CRT的Debug版本,附加"d"。如果没有则说明使用了/MT或/MTd,无法了解构建版本的提示。
遵循库所有者的建议总是最好的,当库的CRT版本或构建设置与你的不匹配时,你可能会遇到很多麻烦。有可能需要向他请求更新,具体情况因人而异。

+1 是指出构建选项与特定 CRT 一样重要,以获得平稳的运行。由于 OP 特别要求 dumpbin.exe,值得注意的是,除了 /HEADERS 之外的所有命令行选项都与 /GL 编译器选项不兼容。 - IInspectable
使用Visual Studio 2015生成的.lib文件中是否不再包含原始命令的嵌入? - 0fnt
不,那仍然有效。但是它需要打开/GL选项(启用整个程序优化),库供应商绝不能禁用它。 - Hans Passant
2
在我检查的所有.lib文件中,我只看到了-defaultlib:MSVCRT或-defaultlib:MSVCRTD,而不是整个cl.exe命令行。但是defautlib标志足以告诉是否传递了/MD或/MDD给cl.exe。 - buzz3791

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接