如何判断一个 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 编译的?的主要内容,如果未能解决你的问题,请参考以下文章
Cef编译 CefSharp编译失败,检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”