我正在编写一个测试C dll的小型C ++程序,其中包含一些功能。这些dll存在于调试版本和发行版本中,我想用同一程序加载它们,并将它们与以前的版本进行比较。
问题是,当我使用release config编译程序时,它只能使用也发布的dll,而当我使用debug config编译程序时,它只能使用也调试的dll。
我使用LoadLibrary和GetProcAddress函数加载dll /函数。
函数有两种类型:
void type1(int&)和void type2(vector<string>*)。无论配置如何,类型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);
Run Code Online (Sandbox Code Playgroud)
最后一行是程序失败的地方,并显示诸如“ 0xC0000005:访问冲突读取位置0xbaadf008”的错误。如果调用程序和dll的配置不匹配。该错误是在程序被释放并且dll被调试时的读取冲突,但是在程序被调试并且dll被释放时的写入冲突。
该函数应该做的只是使用不同的字符串多次调用push_back(“ x”)。
在发行配置程序中使用调试dll似乎并不是完全不可能的,或者类型1的所有功能也不起作用,因此似乎与vector或string类有关。
任何人都不知道如何解决这个问题,或者使用两个具有不同配置的可执行文件是我唯一的选择?
许多(如果不是全部)STL 类对调试构建使用不同的布局。因此,您不能在程序的 RELEASE 构建中使用来自 dll(如 std::string 和 std::vector)的此类调试编译类,反之亦然。
应避免在 dll 的接口中使用 STL 类型/类,而应使用内置类型。在那种情况下,您将永远不会遇到这些问题。
顺便说一句:我当然是在谈论 MSVC++(我不知道的其他编译器)。