调试版本的 DLL 接口参数损坏,但发布版本 c++ visual studio
DLL interface parameter mangled for debug version but not for release version c++ visual studio
我有一个打包为 DLL 的库,当我从调用程序访问一个简单函数时,我的行为很奇怪(在 C++ 中和使用 visual studio 2019)。
DLL 头文件和函数:
bool libvpop_EXPORT GetLibVersion(string& version);
bool GetLibVersion(string& version)
{
version = VPOPLIB_VERSION;
return true;
}
调用代码:
bool VPLIB_Return;
string verstring = "XX";
VPLIB_Return = GetLibVersion(verstring);
这在调用程序的发布版本中工作正常,但在调试版本中,verstring 参数在调用和目标函数 GetLibVersion 之间似乎被完全破坏(即 verstring = "\x11ta\x2") .我仔细检查了调试版本和发布版本之间的项目属性,将它们设置为相等并返回无济于事。只是想知道是否有人知道为什么参数传递在调试和发布版本之间会有所不同。还有一点,这个 DLL 库还有许多其他功能,似乎工作正常。
感谢 Richard Critten 的提示,我现在明白是怎么回事了。我的 dll 库被编译为发布配置。我的调用程序的发布配置工作正常,因为 std::string 对象是兼容的,但我的调用程序的调试配置必须使用 std 的调试版本。修复需要对调试配置的项目属性进行 2 处更改:1) 将 C/C++->代码生成->运行时库从 Multi-threaded 调试 DLL 更改为 Multi-threaded DLL 和 2 ) 更改了 C/C++->Preprocessor Definitions 以包含 NDEBUG 而不是 _DEBUG。我没有意识到 std 库有 debug 和 nodebug 版本。
我有一个打包为 DLL 的库,当我从调用程序访问一个简单函数时,我的行为很奇怪(在 C++ 中和使用 visual studio 2019)。
DLL 头文件和函数:
bool libvpop_EXPORT GetLibVersion(string& version);
bool GetLibVersion(string& version)
{
version = VPOPLIB_VERSION;
return true;
}
调用代码:
bool VPLIB_Return;
string verstring = "XX";
VPLIB_Return = GetLibVersion(verstring);
这在调用程序的发布版本中工作正常,但在调试版本中,verstring 参数在调用和目标函数 GetLibVersion 之间似乎被完全破坏(即 verstring = "\x11ta\x2") .我仔细检查了调试版本和发布版本之间的项目属性,将它们设置为相等并返回无济于事。只是想知道是否有人知道为什么参数传递在调试和发布版本之间会有所不同。还有一点,这个 DLL 库还有许多其他功能,似乎工作正常。
感谢 Richard Critten 的提示,我现在明白是怎么回事了。我的 dll 库被编译为发布配置。我的调用程序的发布配置工作正常,因为 std::string 对象是兼容的,但我的调用程序的调试配置必须使用 std 的调试版本。修复需要对调试配置的项目属性进行 2 处更改:1) 将 C/C++->代码生成->运行时库从 Multi-threaded 调试 DLL 更改为 Multi-threaded DLL 和 2 ) 更改了 C/C++->Preprocessor Definitions 以包含 NDEBUG 而不是 _DEBUG。我没有意识到 std 库有 debug 和 nodebug 版本。