我有一个包含如下代码的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),因此到目前为止,这一直不是问题。
答案 0 :(得分:1)
这就是我的生活。除非您具有完全相同的编译器(包括C ++标准库)和编译器设置,否则不能保证它能正常工作。从C ++ Standards的角度来看,我并没有确信即使这样做也可以正常工作。几乎不可能在C ++中构建ABI。在您的特定示例中,不能保证struct
的构造将具有相同的对齐特征。 sizeof(std::string)
的差异很大,部分原因是短字符串优化,甚至可以通过编译器配置。
替代品:
对导出的函数和由调用者分配和释放的char *样式的接口使用C链接(请参阅Windows API)。 (永远不要在客户端中分配内存并在dll中取消分配,反之亦然。)
确保库的用户可以从源文件构建它。考虑将分发作为静态库而不是动态库,因为使用前者会更容易一些。