2010-11-19 27 views
2

必要なストレージバックエンドの機能をまとめた動的(.so)ライブラリを作成しました。
それが知られているインターフェースを提供し、memcachedのは、MySQL、SQLiteのようなもののためのバックエンドを提供するものであるとして...など共有ライブラリの依存関係を処理する方法

今私の問題は私の共有ライブラリがlibmysqlclientの上、のlibsqlite3に、libmemcachedに依存していることです。.. sqliteだけを必要とするクライアントはlibmemcachedをインストールする必要がないので、私はそれをパックする方法を知らない。

私は別のライブラリでそれを分割しようと考えていましたが、私はほぼ20のライブラリで終わるようですが、私はその考えが気に入らないのです。

代替手段はありますか?

答えて

3

1つの方法は、作成した共有ライブラリ内にインタフェースを置くことです。実行時に依存関係を読み込むことができます。だから、例として、あなたは、さまざまなコンポーネントのために別々の 初期化機能を持つことができます。

init_memcached(); 
init_sqlite(); 

あなたはdlopen()や友人を使用して、これらの初期化関数を実装します。

0

実行時に必要な共有ライブラリのみを読み込むことはできますが、私の意見ではそれほど良いアプローチではありません。

私は共有ライブラリを分割しますが、20個のライブラリには分割しません。いくつかの共通機能をグループ化できるかどうかを確認してください。

+0

私は不思議です - どうして最初のアプローチは良いとは思わないでしょうか? – Sudhanshu

+0

@Sudhanshuそのアプローチの問題は、必要なすべての関数のアドレスを取得しなければならないということです.cではうまく動作しますが、C++ではいくつかのジャグリング(オブジェクトの作成や削除など)が必要です。 –

2

dynamic loadingを使用すると、dlsymdlopenを使用できます。 このアプローチの利点は、クライアント側で共有ライブラリが見つからない場合にアプリケーションが正常に動作することです。

関連する問題