2011-01-16 4 views
7

対静的私は3つの主要な部分があります。リンク:私のアプリケーションの動的

  • をexeファイル:実行可能ファイル
  • Lib_A:ライブラリがで使用するいくつかの計算のためのシングルトンクラスと基本クラスが含まれていますシングルトン クラスLib_B
  • :ライブラリはLib_A

Lib_Bがある中で、私は派生クラスを持っている理由でベースから派生したクラスの数が含まれています、私は希望しますExeから実行時にLib_Bをコンパイルする。私はシステム全体を終了させることなく、計算中に派生クラスを生成する必要があります。これは私にはあまりにも重要です。つまり、最初はLib_B1が動的に読み込まれたと言っているかもしれませんし、他のバージョンのLib_BをLib_B2、Lib_B3、Lib_B4などとしてコンパイルし、それらを動的に読み込むこともできます。すべてのLib_Bxライブラリには、クラスをエクスポートするためのエントリポイント関数があります。

ので、アカウントに次の事実を取る:

  • 実行時に同じLib_Aを共有しているファイルの様々な数があるでしょう。
  • アプリケーションはWindowsおよびLinuxで実行する必要があります。したがって、部分的なクロスプラットフォーム性が問題です。
  • 私はQtは、静的または動的の両方のexeファイルに対してLib_Aのリンクの長所と短所は何ですか

などtbb.dllのような独自のライブラリを有していてもよい、TBB、ブーストのようないくつかのライブラリを使用するつもりですそしてLib_Bx's?性能、システムの大きさなどは、どのように影響を受けますか? Exe、Lib_A、Lib_Bxに同じコンパイラを使用する必要がある、それぞれのOS以外にも危険な状況や難しい状況がありますか?

システム全体の設計は私にとっては非常に難しい問題であるため、コメントをいただければ幸いです。

ありがとうございました。

答えて

6

私はあなたのプロジェクトの説明を理解しているので、Lib_Aを動的にリンクする必要があります.Lib_AをLib_Bx共有ライブラリのそれぞれに静的にリンクすると、Lib_Aコードと静的変数のx倍が複製されます。フォームを持っているLib_Aでクラス、持っている場合

セイは、:

class BaseKlass 
{ 
    static int instance_count; 
    ... 
}; 

instance_countを、それが不可能BaseKlassそのインスタンスをカウントするために作るので、すべての共有ライブラリに複製されます。

は、あなたは、おそらくあなたは、私がmentionned何に関連する問題について説明し、このboost.python documentを見ている必要がありますなど、より微妙な仮想テーブルでの問題、またはRTTI(dynamic_castを)、

にかますることができます。

Boost.pythonでは、同じプロセスで読み込まれるPythonモジュール(動的ライブラリ)を作成することができます。 boost.pythonで作成された各Pythonモジュールは、別のモジュールのクラスAからクラスBを派生させるなど、C++レベルで通信する場合、問題を避けるためにboost.python libに動的にリンクされています。

3

静的リンクの大きな利点は、DLLをたくさん用意する必要がないことです。裸の実行可能ファイルを出荷しようとしているのでなければ、それは問題ではないと私は思う。

動的リンクには大きな利点があります。変更を加えるたびにアプリケーション全体を再コンパイルする必要はなく、変更されたDLLのみを再コンパイルする必要はありません。更新されたdllは、ABI互換である限り、残りのアプリケーションとは別に配布することができます。

WindowsとLinuxで同じコンパイラを使用する方が簡単かもしれませんが、同じコンパイラを使用する必要はありません。

移植性の高いライブラリを使用している限り、WindowsとLinuxの最大の違いは通常はビルドシステムです。いくつかの開発者は完全に別々のビルドシステムを維持していますが、cmakeのようなクロスプラットフォーム構築システムはたくさんあります。

+0

WindowsではMSVC++コンパイラ、LinuxではインテルC++コンパイラを使いたいです。両方とも、GCCよりも最適化されたコードを生成すると思います。このアプリケーションは、私のためのものです。私はそれを販売するつもりはありません。 –

+0

@sad_man:VCとICCの再配布権を取得する予定ですか?それで幸運。 – ephemient

+0

@ephermient:私は現在、私のアプリケーションをdistiributeしていません。しかし、将来、それを販売すれば、明らかにクライアントは自分のコンパイラーのコピーを提供します。私はそれが良いとは思わないが、これはコンパイルされたバイナリコードの速度を得るためのトリックであることを知っている。今のところ私はVCとICCで大丈夫です。最悪の場合、GCCでアプリケーションを配布できますか? :) –

2

新しいクラスのランタイムを作成したいですか? C++はそのように動作するものではありません。 C++クラスは静的であり、すべてコンパイル時に存在する必要があります。共有され、動的にロード可能なライブラリは、この問題を解決するためのものではありません。

最も簡単な解決策は、動的な型(例えばLuaなど)を持つ言語のインタプリタを埋め込み、その中に実行時の動的オブジェクトを書き込むことです。

実行時にコンパイルされたモジュールとプラットフォームに依存しない方法で対話したい場合は、CORBAのような言語中立でプラットフォームに依存しないインターフェイスを使用することをお勧めします。 LinuxボックスとWindowsボックスでコンパイルして実行したものはすべて相互にやりとりし、新しいメンバーを集めてギャングに加わることができます。

+0

しかし、私はC++のスピードと柔軟性に恩恵をもたらさないかもしれません。 –

+0

アプリケーションの速度は、主に開発者の高いスキルに起因します。ユーザー入力ランタイムから生成されたコードは効率的であるとは限りませんが、プロトタイピングのように効率が必要ない場合に役立ちます。したがって、私はいくつかのスクリプトインタープリタの使用を提案しました。 –

+0

はいユーザー入力実行時から生成されたコードは効率的ではないはずですが、ユーザー入力実行時にコンパイルされたバイナリコードはスクリプトインタープリタのコードよりもはるかに速くなければなりません。 –

0

3つのDLLがすべてDLLの場合、これはすべて可能です。アプリからコンパイラを起動し、新しいDLLを動的にロードすることができます。これは他のプラグインアーキテクチャとまったく同じです(Lib_Bx DLLをプラグインとみなしてください)。

私はこれが賢明なアプローチかどうか疑問に思います。ソリューションにC++コンパイラの完全な柔軟性が必要ですか?あなたは問題を解決するさまざまな方法をプロファイリングしましたか?数値処理をしているのであれば、OpenCLのようなものが良い方法でしょうか?