用于对现有构建(二进制文件集、exe、dll、lib)进行故障排除。
有没有办法使用 SDK 或其他实用程序中的命令行工具来快速检查目标文件编译时所针对的运行时库类型?
例如,给定的 .dll 显然是针对动态运行时编译的(但如果它是调试或发布版本,则仍然不明显)。
而在 .exe 的情况下则更困难(确定是否使用动态/静态和调试/发布)。
(我的意思是,无需打开 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
Run Code Online (Sandbox Code Playgroud)
当您使用 编译时/MDd,您的模块依赖于调试 msvcr120d.dll:
>cl /MDd /nologo test.cpp
test.cpp
>dumpbin /dependents test.exe | findstr dll
MSVCR120D.dll
KERNEL32.dll
Run Code Online (Sandbox Code Playgroud)
当您使用/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
Run Code Online (Sandbox Code Playgroud)
当您静态链接 Visual C++ 库时,通常无法判断是否链接了零售库或调试库(通常您无法判断是否链接了任何 Visual C++ 库)。如果您的模块有 PDB,则通常可以使用它根据源文件信息和模块中存在的函数来确定链接的内容。
(两个注意事项:[1] 我的 test.cpp 文件是一个简单的 C Hello, World! 程序。如果它动态链接其他 Visual C++ 库,dumpbin /dependents也会报告它们。[2]dumpbin /dependents与 DLL 一起工作同样良好。)