如何判断一个 lib 是用 /mt 还是 /md 编译的?

Posted

技术标签:

【中文标题】如何判断一个 lib 是用 /mt 还是 /md 编译的?【英文标题】:How to tell if a lib was compiled with /mt or /md? 【发布时间】:2013-10-21 06:19:14 【问题描述】:

给定一个编译后的lib,有没有办法通过查看它(可能使用dumpbin 工具)来判断它是用/md 还是/mt 编译的?

编辑: dumpbin /directives foo.lib 是针对lib 未使用/GL 开关编译的情况的解决方案。是否可以检查以这种方式优化的lib 文件?

【问题讨论】:

您能否更改已接受的答案,因为它不再起作用并且投票数少于下面的答案? 【参考方案1】:

是的,您可以使用 dumpbin 的 /DIRECTIVES 选项来查找 .lib 中的对象要链接的运行时库:

dumpbin /directives foo.lib

查找指定here 的运行时库的实例。例如,您可能会看到:

/DEFAULTLIB:MSVCRTD(使用 /MDd 编译的模块)

/DEFAULTLIB:MSVCRT(使用 /MD 编译的模块)

/DEFAULTLIB:LIBCMT(使用 /MT 编译的模块)

可能会有很多 /DEFAULTLIB 指令,因此您可以使用以下术语进行搜索:

dumpbin /DIRECTIVES foo.lib | find /i "msvcr"

【讨论】:

/DEFAULTLIB 是链接器的开关 - 我如何使用 dumpbin 输出它? /DEFAULTLIB:MSVCRTD 是 Chris 所说的 dumpbin 输出的一个示例。它也是一个链接器指令。【参考方案2】:

Microsoft 编译器的一个非常好的特性是它保留了用于将源文件编译成 .obj 文件的命令行。这允许您通过查看 .lib 文件来找到它,等待它,Notepad.exe。只需搜索“cl.exe”即可。

例如,这是我在使用 VS2013 构建的名为 Win32Project1.lib 的示例库上打开记事本时看到的:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\CL.exe cmd -c -ZI -nologo -W3 -WX- -sdl -Od -Oy- -DWIN32 -D_DEBUG -D_LIB - DHELLO_*** -D_UNICODE -DUNICODE -Gm -EHs -EHc -RTC1 -MDd -GS -fp:precise -Zc:wchar_t -Zc:forScope -Ycstdafx.h -Fp"c:\Users\hpass_000\documents\visual studio 2013\Projects \Win32Project1\Debug\Win32Project1.pch" -Fo"c:\Users\hpass_000\documents\visual studio 2013\Projects\Win32Project1\Debug\" -Fd"c:\Users\hpass_000\documents\visual studio 2013\Projects\ Win32Project1\Debug\vc120.pdb" -Gd -TP -analyze- -errorreport:prompt -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include" -I"C:\Program Files (x86 )\Microsoft Visual Studio 12.0\VC\atlmfc\include" -I"C:\Program Files (x86)\Windows Kits\8.1\Include\um" -I"C:\Program Files (x86)\Windows Kits\8.1 \Include\shared" -I"C:\Program Files (x86)\Windows Kits\8.1\Include\winrt" -X src stdafx.cpp pdb c:\Users\hpass_000\documents\visual studio 2013\Projects\Win32Project1\调试\vc120.pdb

如你所知,我是用 /MDd 编译的

请注意,一个 .lib 可以包含多个可能具有不同设置的 .obj 文件。搜索“-mt”和“-md”可以快速找到。

【讨论】:

这太棒了!我使用 sysinternal 的“strings.exe”工具领先一步 这似乎不再是真的,无论是 .lib、.obj 还是 .exe(即在 VS2013 中尝试 protobuf 2.6.1) @FernandoGonzalezSanchez,VS2017 也是如此

以上是关于如何判断一个 lib 是用 /mt 还是 /md 编译的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在MD(d)和MT(d)工程间正确分配和释放动态内存

运行时库以及静态库,动态库之间的关系

我应该用 /MD 还是 /MT 编译?

VC 运行时库 /MD/MDd 和 /MT/MTd

Cef编译 CefSharp编译失败,检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”

LNK1104:无法打开文件'mfc90.lib“