如何检查从 VC++ 生成的二进制 exe 的运行时库类型

How to check the runtime library type of a binary exe generated from VC++

用于对现有构建(二进制文件集、exe、dll、lib 的集合)进行故障排除。

有没有办法使用 SDK 或其他实用程序中的命令行工具来快速检查目标文件编译时所针对的运行时库类型?

例如,给定一个 .dll 很明显它是针对动态运行时编译的(但它仍然不明显,如果它是 Debug 或 Release 版本)。

虽然在 .exe 的情况下更困难(确定是否使用了 Dynamic/Static 和 Debug/Release)。

(我的意思是,无需打开 VC++ 项目文件或查看 nmake / msbuild 文件中使用的编译器选项)。

dumpbin /dependents 将允许您确定一个模块(EXE 或 DLL)是否依赖于 Visual C++ 库 DLL(以及这些 DLL 的版本和风格——调试或发布)。例如,使用 Visual C++ 2013...

当您使用 /MD 编译时,您的模块依赖于零售 msvcr120.dll:

>cl /MD /nologo test.cpp
test.cpp

>dumpbin /dependents test.exe | findstr dll
    MSVCR120.dll
    KERNEL32.dll

当您使用 /MDd 编译时,您的模块依赖于调试 msvcr120d.dll:

>cl /MDd /nologo test.cpp
test.cpp

>dumpbin /dependents test.exe | findstr dll
    MSVCR120D.dll
    KERNEL32.dll

当您使用 /MT/MTd 编译时,您的模块不依赖于任何 CRT DLL:

>cl /MT /nologo test.cpp
test.cpp

>dumpbin /dependents test.exe | findstr dll
    KERNEL32.dll

>cl /MTd /nologo test.cpp
test.cpp

>dumpbin /dependents test.exe | findstr dll
    KERNEL32.dll

静态链接 Visual C++ 库后,通常无法判断是否链接了零售库或调试库(通常无法判断是否链接了任何 Visual C++ 库)。如果您的模块有一个 PDB,您通常可以使用它来根据源文件信息和模块中存在的函数找出链接的内容。

(两个注意事项:[1] 我的 test.cpp 文件是一个简单的 C Hello, World! 程序。如果它动态链接其他 Visual C++ 库,dumpbin /dependents 也会报告它们。[2 ] dumpbin /dependents 同样适​​用于 DLL。)