gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:22:32 27 4
gpt4 key购买 nike

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

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

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

虽然在 .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

当您使用 /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。)

关于visual-c++ - 如何检查从 VC++ 生成的二进制 exe 的运行时库类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com