【问题标题】:dll in debug mode, calling program in release mode (and vice versa)dll 在调试模式下,在发布模式下调用程序(反之亦然)
【发布时间】:2012-06-06 14:57:54
【问题描述】:

我正在编写一个测试 C dll 的小型 C++ 程序,其中包含一些函数。这些 dll 存在于调试版本和发布版本中,我想用同一个程序加载它们并将它们与以前的版本进行比较。

问题是,当我用 release config 编译我的程序时,它只能使用同样是 release 的 dll,而当我使用 debug config 编译程序时,它只能使用同样是 debug 的 dll。

我使用 LoadLibrary 和 GetProcAddress 函数加载 dll/函数。

有两种类型的函数: void type1(int&)void type2(vector<string>*)。 无论配置如何,Type 1 都可以正常工作。 但是类型 2 仅在配置匹配时才有效。

代码:

typedef void(*GetNames)(vector<string>*);
GetNames get_var_names = (*GetNames)GetProcAddress(dll,"get_var_names");
vector<string> var_names;
get_var_names(&var_names);

最后一行是程序失败并出现类似“0xC0000005:访问冲突读取位置 0xbaadf008”的错误。如果调用程序和dll的配置不匹配。 该错误是在程序发布和dll被调试时读取冲突,但在程序被调试和dll被释放时发生写入冲突。

该函数应该做的只是用不同的字符串调用 push_back("x") 几次。

在发布配置程序中使用调试dll似乎并非完全不可能,或者类型1的所有功能也不起作用,因此它似乎与向量或字符串类有关。

有人知道如何解决这个问题,还是我唯一的选择是使用两个具有不同配置的可执行文件?

【问题讨论】:

  • 请提供您用于两种配置的编译器选项。例如,每个配置可能使用不同的默认调用约定(或其他使它们不兼容的选项)。
  • 您可以关闭迭代器调试以使其兼容。然而,我的医生的建议是just don't do that

标签: c++ dll


【解决方案1】:

许多(如果不是全部)STL 类对调试构建使用不同的布局。因此,您不能在程序的 RELEASE 构建中使用来自 dll(如 std::string 和 std::vector)的这种 DEBUG 编译类,反之亦然。

应避免在您的 dll 接口中使用 STL 类型/类,而应使用内置类型。 在这种情况下,您将永远不会遇到这些问题。

顺便说一句:我说的当然是 MSVC++(其他我不知道的编译器)。

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 2014-02-18
    • 1970-01-01
    • 2018-03-22
    • 2019-09-11
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多