问题虽然通过DLL与Visual Studio边界传递std :: string

时间:2018-12-13 13:24:54

标签: c++ visual-studio dll stl dllexport

我有一个包含如下代码的DLL:

class Info {
    int a
    int b
    int c
    std::string str1;
    std::string str2;
};

__declspec(dllexport) class C {
    Info getInfo();
}

我使用Visual Studio 2015编译了此代码,并且在我的系统上调用C::getInfo()可以正常工作。

现在,其他人正在尝试使用DLL,并且他还在使用Visual Studo2015。该调用进行得很好,但字符串不包含任何可访问的数据。甚至调试器也会报告“读取字符串的错误”,并且在尝试读取该程序时会崩溃。

std::vector也存在类似的问题,我可以通过内联创建矢量的代码来解决。

在我看来,这似乎是其他人正在使用其他STL版本,或者编译器以某种方式为std::string生成了不同的内存布局(尽管他声称使用默认设置)。

这可能吗?我看到VS 2015有不同的更新,我们可能未安装相同的更新。

是否有解决此问题的建议?在不显着破坏API的前提下,我无法转向char*。大多数用户甚至都不使用Visual Studio(或Windows),因此到目前为止,这一直不是问题。

1 个答案:

答案 0 :(得分:1)

这就是我的生活。除非您具有完全相同的编译器(包括C ++标准库)和编译器设置,否则不能保证它能正常工作。从C ++ Standards的角度来看,我并没有确信即使这样做也可以正常工作。几乎不可能在C ++中构建ABI。在您的特定示例中,不能保证struct的构造将具有相同的对齐特征。 sizeof(std::string)的差异很大,部分原因是短字符串优化,甚至可以通过编译器配置。

替代品:

  1. 对导出的函数和由调用者分配和释放的char *样式的接口使用C链接(请参阅Windows API)。 (永远不要在客户端中分配内存并在dll中取消分配,反之亦然。)

  2. 确保库的用户可以从源文件构建它。考虑将分发作为静态库而不是动态库,因为使用前者会更容易一些。

相关问题