我有一个动态库,其中我发送一个IP地址,并试图连接到一个仪器。库在调试模式下构建时运行良好,但在使用release时崩溃。
我正在尝试从控制台应用程序中使用它,这就是我所拥有的:
控制台应用程序中的Main
#define QT_API extern "C" __declspec(dllimport)
int main()
{
QT_InterfaceManager * manager = createInstance();
cout << "Connect = " << bert_Connect(manager, "172.16.109.113") << endl;
cin.get();
return 0;
}接口来自我的dll
#define QT_API extern "C" __declspec(dllexport)
#define STACKMODE __stdcall
QT_API bool STACKMODE bert_Connect(QT_InterfaceManager * inst, std::string IP) {
cout << "Received IP = " << IP << endl;
// Do Something
}使用调试库中的函数时

从发行版库使用我的函数时


在传递一个简单的std字符串时,是什么原因造成了这种差异?
发布于 2022-06-02 20:03:03
调用方和DLL必须以相同的模式类型生成。例如,函数将std::string作为从DLL导出的参数。如果调用者main()也没有在调试中编译,它就会崩溃。编译模式更改std:string的存储定义(秘密)。因此,调试模式中的std::string的调试模式定义与发布模式中的定义不同。被调用的函数在std::string的意义/布局上不一致。这很可能会导致坠机。我建议将字符串作为原始指针传递给dll。使用string.c_str()并将其作为const *使用。这应该没问题。
例如:
QT_API bool STACKMODE bert_Connect(QT_InterfaceManager * inst,const char* IP)
尽管QT_InterfaceManager是不透明的,但它也可能存在类似的问题。
https://stackoverflow.com/questions/62792200
复制相似问题