2012-01-17 10 views
0

私は、Borland 6を使用して既存のアプリケーションにMinGWで作成したライブラリをコンパイルしました(私は以前は分かっていましたが、 .libファイルを作成するためにimplibを使用し、プロジェクトにインポートしました。私はまた、DLLと必要なヘッダファイルへのパスを追加しました。別のコンパイラからdllをインポートする

コンパイルしようとすると、Unnresolved外部型エラーが発生します。私はインポートプロセスのすべてのステップを逃したか?私がしていないと仮定して、問題は名前のmanglingのようなものです。私はそれが私の知識の限界についてのextern Cを含むことを知っています。 DLLの外部からアクセスする必要のあるクラスは2つしかなく、残りはすべて内部的にのみ使用されます。私はextern Cをクラスで完全に構築されたものでどのように使うべきか分かりません。私はそれが私がボールドランドで輸入していることを期待しています。

+0

問題に関するよくある質問(コード例あり)があります。主にLinuxに関係することに注意してください。しかし、私はそれがあなたを助けてくれることを願っています。http://www.faqs.org/docs/Linux-mini/C++-dlopen.html –

答えて

0

extern "C"はクラスには使用できません。フリー関数のみです。したがって、あなたのクラスに "C"インターフェースを書くオプションがあります。各インターフェースはあなたのクラスへのポインタをとり、おそらく作成と破壊の機能を持っています。

これは一般的なやり方であり、あなたのクラスは構造体として前方宣言され、クラスと同じであり、C言語で記述されたアプリケーションでも使用できます。通常はextern "C" __cplusplusが定義されている場合にのみ、#ifdefガードが周りにあります。

クラスがC++でのみ使用され、すべてのクラスメソッドにCインターフェイスを記述する必要がない場合は、別のオプションもあります。

DLLを使用するユーザーは抽象インターフェイスを使用し、抽象インターフェイスへのポインターを作成するのにCreateおよびDestroyメソッド(extern "C")を使用しますが、通常のC++方法でポインターを使用します。もちろん、理想的にはこのポインタをスマートポインタにラップします。 Destroyメソッドを呼び出すカスタムディテクタを持つshared_ptrをブーストします。 (ライブラリのユーザーはそれを行う必要がありますが、ヘッダーのみのインターフェイスを提供することができます)。

これを行うには、他にもいくつか注意が必要な問題があります。実行時の型情報と関係があるものは例外を含め、ユーザー側では機能しない可能性があります。そして、あなたのライブラリは、これをよりC++の方法で処理するための "オープンソース"のC++ラッパー(クライアント側でコンパイルされたもの)を提供することができます。一種のpImpl。

+0

ありがとう、私は教育的な日であることがわかります。クラスを一つにする。面倒な作業をしないようにするには、長い時間を要し、バックラッシュの危険性があるので、そのクラスをシングルトンにしてCスタイルの関数を操作することには何のメリットがありますか? – Bowler

+0

なぜシングルトンである必要がありますか?そのうちの1つだけを持つ必要があり、パラメーターとして渡さなくても、グローバルに使用できるようにする必要がある場合は、これが行われます。 – CashCow

+0

ここでは、インターフェイスクラスのインスタンスが1つしか存在しないので、私は 'マネージャ'型のクラスを持っているときにシングルトンの習慣をつかまそうとしています。私はC関数が呼び出すための単一のポインタが存在するため、ここで役に立つかもしれないかどうか疑問に思っていました。多分問題を解決するのに役立たないかもしれません。 – Bowler

0

名前のマングリングはコンパイラ間で標準化されていません。 extern Cの機能しか公開されていないので、名前が変更されていません。しかし、これにはオブジェクト指向プログラミングを使用できないという制限があります。

もう1つの方法は、バイナリ互換のCOMオブジェクトを実装することです。

関連する問題