是否可以使用发布模式 EXE 执行调试模式 DLL?
我正在尝试这种情况,但 EXE 不加载调试 DLL 并抛出错误“此应用程序无法启动...”。
我知道这不是一个好的方案,但由于某些要求,我必须完成这项工作。
如果您的 dll 接口不依赖于在调试和发布中可能看起来不同的类,它就可以工作。例如,MSVC 中的 std::string 和 std::vector 在调试和发布时不兼容。(栅栏……)
所以例如
std::string GetName();
不管用。
此外,不应转移 new 和 delete,因为调试/发布使用不同的运行时。但无论如何,您应该始终delete
与new
.
是的,这可以工作。
您的“应用程序无法启动”问题很可能是您将 DLL 的调试版本(使用 Visual Studio 构建在您的机器上)复制到没有安装 DEBUG CRT 的机器上。通常将 MSVCRTD(version).dll 复制到与程序文件相同的目录可以解决此问题。我有一个先前的答案,其中涵盖了其中的一些内容。
最好的办法是始终将所有二进制文件链接到同一个动态 MSVCRT DLL,以便它们都共享同一个运行时。
另一个简单的解决方法是编译您的 DEBUG DLL 以使用与 MSVCRT DLL 相同的风格(或静态链接到 CRT)。在 VS 项目属性页面(我认为是代码生成)中的某处是选择 CRT 的下拉菜单。将零售 MSVCRT 链接到调试 DLL 或静态链接没有任何问题。
需要注意的是,当您有不同风格的调试 C 运行时链接到不同的二进制文件时。如果您为 EXE 链接了发行版 MSVCRT dll,但为 DLL 提供了调试 MSCVRTD DLL,则在某些情况下可能会导致问题。这是因为句柄和内存块由 CRT 的两个不同实例跟踪。
例子:
如果你在 EXE 中分配内存,但在 DLL 中释放。反之亦然。
文件句柄在 EXE 中使用 fopen() 打开,但在 EXE 中使用或关闭(反之亦然)。
对于 DLL 接口的任何头文件,在头文件中实现任何类型的内联函数或方法都是导致 #1 或 #2 发生的简单方法。
共享 STL 对象(std::string、std::list、std::vector)是混合 CRT 使用的绝对禁忌。