我知道无法安全地导出函数C ++参数(例如STL字符串),因为C ++没有指定标准ABI。 (我已将其作为How to call a function from a shared library?)的答案
人们倾向于相信如果您的库和程序都使用相同的编译器构建那么这不是问题,但不幸的是,对于某些VC ++编译器来说,这并不完全正确
“C ++编码标准”中的Herb Sutter和Alexandrescu建议依赖于可移植类型(例如内置类型)而不是采用string
的函数。
即代替在模块接口中使用std::string
std::string Translate( const std::string & );
使用
void Translate( const char *src, char* dest, size_t destSize );
虽然他们同意这对于来电者和被叫者来说都相当复杂,但他们并没有提出更好的选择。
如何使用低级类型很好地传递更复杂的对象,例如std::map
? (更不用说像map<string,vector<something_complex> >
那样复杂的东西)
在导出函数时如何解决此类问题?
答案 0 :(得分:4)
您不仅需要使用相同的编译器(或兼容的ABI)构建程序,还需要使用相同的设置:debug&amp;发布模式,DLL和静态模式,检查迭代器(或不),等等。在一个方面,STLPort
做得恰到好处:std::string
根据这些设置将其库的构建重命名为不同的符号,完全避免了这个问题。
另一个选项是将不透明指针传递给DLL中分配,处理和使用的对象。实际上,如果要将它们用作DLL之外的对象,请将自己的虚拟接口用于所需的功能。