我正在尝试使我的项目符合GCC以链接与MSVC编译的库(我没有任何来源)。问题是这个库也存在于linux x86,x86_64和用GCC编译的arm平台(我的项目是跨平台),我不想编写很多依赖于平台(和编译器相关)的代码。与项目链接的其他库也设计为由GCC编译(如ffmpeg和vlc),我无法迁移到MSVC。 为此,我编写了C风格的包装库(基于原始标题)。
类的构造函数和析构函数以这种方式完成:
__declspec(dllexport) void* myClass_myClass()
{
void* ptr = new myClass();
return ptr;
}
__declspec(dllexport) void myClass_unmyClass(void* ptr)
{
delete((myClass*)ptr);
}
此部分使用MSVC编译并链接到原始库。如你所见(我可以在依赖walker中看到它)我有c风格的导出,我可以链接到GCC。它分配内存,创建对象并按设计行事。
现在我正在编写包含类的包装器的第二部分,并将使用GCC编译并链接到我的项目。它应该基于库的原始标题(以确保它与此库的linux和windows-版本的原始行为相同)。我怀疑如何构建类的构造函数和析构函数。 我们说我们有
class MyClass
{
public:
MyClass()
~MyClass()
}
在原始标题中。
如何在.cpp中定义以绕过对我的c-style" consturctor"的调用?和#34;析构者" (所以他们会绕过对原始构造函数和析构函数的调用)?
}在构造函数中指定this
指针会很棒,但是它是禁止的。
P.S。我没有班级内部。他们都有
private: myClassImpl* m_pImpl;
因此我无法使用复制构造函数。即使我可以 - 我不想构造相同对象的2倍。
答案 0 :(得分:1)
您的包装类应该是一个句柄类,它在构造函数中调用myClass_myClass()
,将返回的指针存储为成员,并在存储指针的析构函数中调用myClass_unmyClass()
。应该在包装器中复制原始类中的所有成员函数,但只需在存储的指针上调用原始函数(通过包装器" C"函数)。小心复制构造函数和复制赋值运算符 - 默认值不会做正确的事情。您必须删除它们或实现它们以调用适当的包装器" C"功能