2011-05-22 4 views
0

共有ライブラリ/ .dllとクラスのインポート/エクスポートに関する質問があります。いくつかの研究の後で私が理解していることは、次の2つの方法です: インターフェイスを使用せずに移植可能な方法でクラスをdllにエクスポートしますか?

  • クラスの前に__declspec(dllexport/dllimport)を使用して、異なるコンパイラバージョンが同じ方法で名前を変更することを祈って、 .dllは異なるコンパイラでは使用できないという事実です。
  • dllの純粋仮想クラスをインターフェイスとして使用します。エクスポートが必要なすべてのクラスは、それらから継承し、仮想関数を実装する必要があります。 .dllがこの場合にエクスポートするものは、オブジェクトを作成して解放する "ファクトリ" Construct/Destruct関数です。
  • これは私が知っている唯一の2つの方法です。最初は0の移植性を提供するので、no-noです。もう一つは便利ですが、目的を達成する.dllの良いプログラミングデザインは、異なるコンストラクターごとに異なるコンストラクター関数を必要とし、POD型のみをパラメーターとして使用でき、多くを失うことに気付くと迷惑になりますオーバーロードされた関数やデフォルトの関数引数などのC++クラスの利点

    ライブラリをユーザーに提供することになっている.dllの場合、たとえば2番目の方法でも、クラスのコレクションは本当に不便になります。だから私はここで解決策が何か疑問に思っていますか?主要なコンパイラごとに異なる.dllを最初の方法でコンパイルするだけですか?大きなライブラリの共有ライブラリ版はどのように機能しますか?たとえば、wxWidgetsは.dllバージョンも提供しています。どのように彼らはインターフェイスソリューションを避ける.dllのエンドユーザーによってクラスの通常の使用を達成するのですか?

    +1

    C++には標準ABIがありません。真の移植性を望むなら、Cに固執する必要があります。 –

    +0

    私はそれを理解しています。本当に移植可能な言語はC言語だけですが、私の疑問はまだありません。 wxWidgetsのような大きなポータブルライブラリは、どのように動的/共有ライブラリを持つことができますか? – Lefteris

    +2

    私はwxWidgetsがソース形式で配布し、あなた自身のコンパイラ用にビルドできると信じています。 –

    答えて

    0

    各コンパイラバージョンごとに別々のDLLを持つソリューションが動作します。それと同時に、それはまだ公式な機能ではありません。次のサービスパックが互換性を壊すかどうかは決して分かりません。互換性を維持/破壊するコンパイラ/リンカーキーの正確なリストは誰にもわかりません.Windows8が最終的にこれを正しい方法で実装したという信頼できる噂が聞こえました。

    ところでVisual Studio 2012リリース候補はまだhttp://msdn.microsoft.com/en-us/vstudio/bb984878.aspxからダウンロードできます。あなたはそれを試してみるべきでしょうか?

    関連する問題