【问题标题】:check what run-time static library or dll uses检查运行时静态库或 dll 使用什么
【发布时间】:2014-10-06 17:10:24
【问题描述】:

Windows SDK 中是否有工具可以检查库使用的 CRT? 例如我有一个 *.lib 文件,如何检查它是用 /MDd 标志还是 /MT 编译的? 还如何检查 dll 或 exe 是否相同? 这可以用dumpbin来完成吗?

【问题讨论】:

    标签: windows winapi msvcrt crt dumpbin


    【解决方案1】:

    如果它是一个 .lib 文件,一个静态链接库,那么你对 CRT 还一无所知。它还没有关联。您可以了解原始程序员的意图,使用十六进制查看器查看 .lib 文件,记事本也可以。您将看到用于编译嵌入在 .lib 文件中的 .obj 文件的原始命令行。只需搜索“cl.exe”,您就会很清楚从 cl.exe 的路径中使用了哪个编译器版本。你可以看到命令行选项,这样你就会知道 /MD 或 /MT 是否有效。还有 /O 选项,这对于了解您是 Debug 还是 Release 构建很重要。

    如果是 .dll 文件,那么 dumpbin.exe /imports 是您的最佳选择。对 msvcrxxx.dll 文件的依赖将可见,其中 xxx 为版本号,如“120”。如果您看到它,则名称会告诉您是否使用了 /MD 或 /MDd,“d”附加到 CRT 的调试版本 如果缺少它,那么您知道使用了 /MT 或 /MTd,没有提示构建风味可用。

    遵循库所有者的建议总是最好的,当库的 CRT 版本或构建设置与您的不匹配时,您可能会遇到很多麻烦。您必须向他询问更新的可能性非零,YMMV。

    【讨论】:

    • +1 指出构建选项与用于平稳行驶的特定 CRT 一样重要。由于 OP 专门要求使用 dumpbin.exe,因此还值得注意的是,所有命令行选项(/HEADERS 除外)都与 /GL 编译器选项不兼容。
    • Visual Studio 2015 是否已停止在生成的 .lib 中嵌入原始命令?
    • 不,这仍然有效。但是,它确实需要打开 /GL 选项(启用整个程序优化),库供应商绝不能禁用它。
    • 在我检查的所有 .lib 文件中,我只看到 -defaultlib:MSVCRT 或 -defaultlib:MSVCRTD 而不是整个 cl.exe dcommand-line。但是 defautlib 标志足以判断 /MD 或 /MDD 是否被传递给 cl.exe。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多