gpt4 book ai didi

visual-c++ - Visual C++ 发布版本 - 字符串在跨 DLL 传递时是否会因为使用不同的运行时版本编译而损坏?

转载 作者:行者123 更新时间:2023-12-04 06:37:38 25 4
gpt4 key购买 nike

在 Release模式下构建后,我看到在 Debug模式下没有发生的异常。在调试发布版本时,看起来字符串引用没有从 EXE(我们的应用程序)正确传递到接收字符串引用的 DLL。

我们的 EXE 代码如下所示:

string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
LOG4CXX_DEBUG要去 log4cxx.dll ,其代码如下所示:
CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& msg) {
if (stream == 0) {
buf.append(msg);
} else {
*stream << msg;
}
return *this;
}

查看调试器中的调用堆栈,当我向下导航到包含我们源代码的框架时,我可以看到 contents是带有 size=583, capacity=838 的有效字符串.

在框架里面 log4cxx.dll (堆栈中的下一帧)字符串引用显示 size=838, capacity=363113231 (而且这些值都是垃圾)。

我们的应用程序和 log4cxx.dll 都在同一台机器上编译,使用相同的运行时设置 (/MD),但 Visual Studio 的版本不同。 log4cxx dll 是使用 Visual Studio 2008 编译的,我们的应用程序是使用 Visual Studio 2010 编译的。在 2 个对象上运行 dumpbin 显示:

我们的应用程序 (EXE)
MSVCP100.dll
MSVCR100.dll

log4cxx.dll (DLL)
MSVCP90.dll
MSVCR90.dll

这个问题是因为他们使用不同的运行时版本吗?

最佳答案

如果您在 DLL/EXE 边界(如 STL 字符串或 CRT 文件指针)之间传递非 POD(纯旧数据类型),您 必须使用相同的共享 CRT。

在您的情况下,您必须使用相同的编译器重新编译所有 DLL/LIB!

另见:I can pass std::string for a Dll and what i can do with DLL´s?

关于visual-c++ - Visual C++ 发布版本 - 字符串在跨 DLL 传递时是否会因为使用不同的运行时版本编译而损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18021517/

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