gpt4 book ai didi

c++ - dll 在 Debug模式下,在 Release模式下调用程序(反之亦然)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:05 24 4
gpt4 key购买 nike

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

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

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

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

代码:

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

最后一行是程序失败的地方,出现类似“0xC0000005:访问冲突读取位置 0xbaadf008”的错误。如果调用程序和dll 的配置不匹配。该错误在程序发布和dll调试时为读违规,而在程序调试和dll发布时为写违规。

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

在发布配置程序中使用调试dll似乎并非完全不可能,或者类型1的所有功能也不起作用,所以它似乎与vector或string类有关。

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

最佳答案

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

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

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

关于c++ - dll 在 Debug模式下,在 Release模式下调用程序(反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10916816/

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