我正在尝试从带有 stl 成员的 DLL 中导出 C++ 类。
这是我的主要课程。
class MATHFUNCSDLL_API MyMathFuncsImpl
{
public:
std::vector<int> vi;
std::string getString();
void setString(std::string s);
private:
std::string s;
};
使用这些方法是可行的,但会在 VS 2012 上发出有关 std::string 和 std::vector 没有 dll 接口的警告。现在当我这样做时 -
class MATHFUNCSDLL_API MyMathFuncs
{
public:
MyMathFuncs()
{
pImpl = new MyMathFuncsImpl();
}
std::string getString()
{
return pImpl->getString();
}
std::vector<int> getVector()
{
return pImpl->vi;
}
void setString(std::string news)
{
pImpl->setString(news);
}
private:
MyMathFuncsImpl* pImpl;
};
我没有收到任何警告,而且它也有效。我的问题是:拥有这样的接口是否真的可以解决问题(stl 成员可能在 dll 边界上以不同的方式实现),或者只是抑制编译器问题的一个技巧?
Yes.
切勿在 DLL 接口中使用内联函数。这包括应该显式声明但在实现文件中定义的构造函数和析构函数。对于 C++,这意味着您应该使用 pImpl 习惯用法或虚拟基类。
避免内联函数的原因是它们可能从一个版本到下一个版本发生变化,而 DLL 保持不变。任何不匹配都会导致奇怪和可怕的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)