2011-12-22 16 views
11

私は共有ライブラリに応じてアプリケーションに失敗していることに気付きました。依存関係がない場合でも、ユーザーは依存関係の機能を使用する意思がない場合でもロード時にに失敗します。オプションの共有ライブラリ

私のアプリはそれより優れていると思います。理想的には、n個の異なるパッケージを配布するのではなく、 n = numberOfSupportedArchitectures * numberOfSupportedOS * Π(各共有ライブラリの場合) 「共有ライブラリの読み込み中にエラーが発生しました」という例外が発生するライブラリが必要ではないと思っているロード時に不在であることが判明した場合、関連の解決されていないリンクの使用を避けるだけの方法で実行を続行します。しかし、明らかに例外を捕まえることはできません。何かが見つからない場合、main()が起動する前にすべてが落ちます。

ローディングプロセスを制御できる最も近いのは、すべてのリンクをdlopen、dlsymなどで自分で解決することです。とても面倒です。私にはすでにそれができるライブラリがあると思いますか?

これは、ソースベースのディストリビューションやWindowsでは問題ではないことに注意してください。私はタグにバイナリパッケージを入れようとしていましたが、明らかに私はコインタグの担当者を持っていません。

'は、OSのローダー/リンカーの動作を改良する最も洗練されたソリューションのようです。

答えて

0

自分で共有ライブラリを組み込み、-rpath $ORIGINでリンカーの検索パスを調整することができます。

+0

または、環境変数 'LD_LIBRARY_PATH'を設定するスクリプトでプログラムを実行してください。 – rodrigo

+0

ライブラリをロードする代わりに、異なるバージョンのものだけでなく、まったく異なるインタフェースを持つか、まったくなくても提供する機能はUXには現れません。 これは、不在のライブラリを処理する手段を提供する可能性がありますが、私は不足しているターゲットと同じインタフェースを持つ不活性なshillライブラリを作成することができました。ターゲットが見つからない場合、リンカは何かにリンクする必要があります。しかし、愚かに見えます。 – mako

2

weak symbolsをご覧ください。しかし、これはCまたはC++標準の一部ではないため、コンパイラに少し依存します。しかし、もしあなたがGCCのために行くなら、それはあなたのために働くだろうと思います。

+0

これはライブラリのヘッダー内のすべてのシンボルに対して不活性ボディを定義する必要はありませんか? – mako

+1

実際はありません。あなたはシンボルの存在をテストすることができます。あなたが 'void foo();'を持っているなら、あなたは以下のようにそれらを呼び出すことができます: 'if(foo)foo();' – Krizz

+0

Ah。しかし、私はすべてを弱い記号として宣言しなければなりませんか? – mako

関連する問題