【问题标题】:Debug DLL with release EXE使用发行版 EXE 调试 DLL
【发布时间】:2013-02-14 11:50:57
【问题描述】:

是否可以使用发布模式EXE执行调试模式DLL?

我正在尝试这种情况,但 EXE 没有加载调试 DLL 并抛出错误“此应用程序无法启动...”。

我知道这不是一个好的方案,但由于某些要求,我必须完成这项工作。

【问题讨论】:

  • 是的,有可能。加载失败应该是它自己的特定原因,例如缺少依赖项。
  • 检查您的调试构建设置。通常,当缺少库或您在代码生成中使用“多线程调试 Dll”选项进行构建时会显示此错误。
  • @Abhineet:我尝试使用“多线程 DLL”选项进行构建。还是同样的问题...
  • 没有人,试试“多线程”或“多线程调试”。

标签: c++ debugging release


【解决方案1】:

是的,这可以工作。

您的“应用程序无法启动”问题很可能是您将 DLL 的调试版本(使用 Visual Studio 在您的机器上构建)复制到了未安装 DEBUG CRT 的机器上。通常将 MSVCRTD(version).dll 复制到与程序文件相同的目录可以解决此问题。我有一个先前的答案,其中涵盖了其中的一些 here

最好的办法是始终将所有二进制文件链接到同一个动态 MSVCRT DLL,以便它们都共享同一个运行时。

另一个简单的解决方法是编译您的 DEBUG DLL 以使用与 MSVCRT DLL 相同的风格(或静态链接到 CRT)。在 VS 项目属性页面(我认为是代码生成)中的某处是选择 CRT 的下拉菜单。将零售 MSVCRT 链接到调试 DLL 或静态链接没有任何问题。

需要注意的是,当您有不同风格的调试 C 运行时链接到不同的二进制文件时。如果您为 EXE 链接了发布版 MSVCRT dll,但为 DLL 提供了调试 MSCVRTD DLL,则在某些情况下可能会导致问题。这是因为句柄和内存块由 CRT 的两个不同实例跟踪。

例子:

  1. 如果您在 EXE 中分配内存,但在 DLL 中释放。反之亦然。

  2. 文件句柄在 EXE 中使用 fopen() 打开,但在 EXE 中使用或关闭(反之亦然)。

  3. 对于 DLL 接口的任何头文件,在头文件中实现任何类型的内联函数或方法都是导致 #1 或 #2 发生的简单方法。

    李>
  4. 共享 STL 对象(std::string、std::list、std::vector)绝对禁止混合 CRT 使用。

【讨论】:

    【解决方案2】:

    如果您的 dll 接口不依赖于在调试和发布时可能看起来不同的类,它就可以工作。 例如MSVC 中的 std::string 和 std::vector 在调试和发布中不兼容。 (栅栏...)

    例如

    std::string GetName();
    

    不会工作。

    另外,不应转移 new 和 delete,因为调试/发布使用不同的运行时。但无论如何,您应该始终 delete 在与 new 相同的上下文(dll/exe)中。

    【讨论】:

    • 我创建了一个非常基本的 DLL,它只是返回一个整数值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多