首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ std字符串在调试和发布动态库中的不同

C++ std字符串在调试和发布动态库中的不同
EN

Stack Overflow用户
提问于 2020-07-08 09:58:42
回答 1查看 223关注 0票数 1

我有一个动态库,其中我发送一个IP地址,并试图连接到一个仪器。库在调试模式下构建时运行良好,但在使用release时崩溃。

我正在尝试从控制台应用程序中使用它,这就是我所拥有的:

控制台应用程序中的Main

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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字符串时,是什么原因造成了这种差异?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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是不透明的,但它也可能存在类似的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62792200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档