私のプロジェクトがMSVCでコンパイルされたライブラリとリンクするためにプロジェクトをGCCに準拠させようとしています。問題は、このライブラリもlinux x86、x86_64、GCCでコンパイルされたアームプラットフォーム(そして私のプロジェクトはクロスプラットフォーム)にも存在し、プラットフォーム依存の(そしてコンパイラ依存の)コードをたくさん書いたくないということです。また、プロジェクトにリンクされた他のライブラリは、GCC(ffmpegやvlcなど)によってコンパイルされるように設計されており、MSVCに移行する可能性はありません。 私はCスタイルラッパーライブラリ(元のヘッダーに基づいて)を書いています。C++からポインタを構築する
コンストラクタとクラスのデストラクタは、この方法で行われています。
__declspec(dllexport) void* myClass_myClass()
{
void* ptr = new myClass();
return ptr;
}
__declspec(dllexport) void myClass_unmyClass(void* ptr)
{
delete((myClass*)ptr);
}
この部分はMSVCでコンパイルされ、元のライブラリにリンクされています。あなたが見ているように(それは依存性ウォーカーで見ることができます)、私はGCCとリンクできるCスタイルのエクスポートを持っています。メモリを割り当て、オブジェクトを作成し、設計通りに動作します。
私はクラスを含むこのラッパーの第2部分を書いており、GCCでコンパイルされ、プロジェクトにリンクされます。ライブラリの元のヘッダーに基づいている必要があります(このライブラリのlinux版とwindows版の両方で元のものと同じように動作するようにする必要があります)。私はクラスのコンストラクタとデストラクタを作る方法を疑問に思っています。
class MyClass
{
public:
MyClass()
~MyClass()
}
元のヘッダーにあるとしましょう。
私のc-style "consturctor"と "destructor"への呼び出しをバイパスするために.cppでどのように定義できますか?(元のコンストラクタとデストラクタへの呼び出しをバイパスします) コンストラクタでポインタをthis
に割り当てることは素晴らしいことですが、これは禁止されています。
P.S.私はクラスの内部がありません。彼らはすべての
private: myClassImpl* m_pImpl;
ので、私はコピーコンストラクタを使用することはできませんがあります。私ができたとしても、私は同じオブジェクトを2回構築したくありません。
「バイパス」とはどういう意味ですか?また、 'void *'を使う理由もありません。 'MyClass *'を使う。純粋なC言語で理解できるようにするには、 'struct MyClass *'(またはtypedefを使用)を使用できます。 – ymett
@ymett私のCスタイルの「コンストラクタ」をmyClassの元のコンストラクタを何らかの形で呼び出し、作成したクラスへのポインタとして返されたポインタを取得することを意味します。 'void *'の代わりに 'myClass *'を使うのは正しいかもしれませんが、C言語の "クラスへのポインタ"のようなものがないとどうしたらいいですか? – ElDorado
「バイパス」はあなたが望む言葉ではないと思います。構造体とクラスはC++で同じものですが、Cにはポインタから構造体があります。 – ymett