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

时间:2015-02-24 03:23:31

标签: visual-c++ msvcrt

用于对现有构建(二进制文件集,exe,d,dll' s,lib')进行故障排除。

有没有办法,使用SDK或其他实用程序中的命令行工具快速检查运行时库类型是否编译了对象文件?

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

虽然在.exe的情况下更难(确定是否使用了动态/静态和调试/发布)。

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

1 个答案:

答案 0 :(得分:2)

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] {{1与DLL一样好用。)