ダイナミックライブラリはRAMを節約し、プログラムが実行されたときにのみ必要なので良いと聞きました。
今質問があります。プログラムが実行できる場合は、必要な動的ライブラリがすでにそこにあると言うことができますか(動的ライブラリの欠落エラーなし)。
プログラムがそれぞれ動的ライブラリを必要とする.o
3つのファイルにリンクされているとします。.o
動的ライブラリを削除してもプログラムは引き続き実行されますか?
私が知っている限り、動的ライブラリをロードする方法は2つあります。
- 動的ライブラリは、オブジェクトファイルをリンクするとロードされます。たとえば、
g++ a.cpp -ltest
ここでは動的ライブラリをlibtest.so
プログラムにリンクします。削除するとlibtest.so
プログラムを実行できません。 - システムAPI機能を使用して動的ライブラリをロードします。
dlopen
この場合、私が理解している限り、プログラムの実行がコードに触れなければdlopen
エラーは発生しません。
私が正しいとすれば、プログラムがエラーなしで実行されれば、必要なすべての動的ライブラリがそこにあるはずです。
答え1
これは、デフォルトでは、プログラムの起動時に動的ライブラリがロードされるか(ld.soの一般的な動作)、またはライブラリが必要なコードが最初に実行されたときにゆっくりロードされるかによって異なります。最初のケースでは、プログラムは非常に早いエラーで終了します。 2番目のケースでは、動的ライブラリを必要とするコードはまったく実行されず、正常に実行できます。 2番目のケースの例には、ファイルの種類に応じてオーディオコーデックをロードするオーディオファイルハンドラがあります。 mp3コーデックがインストールされていない場合でも、他のファイル形式で動作する可能性があります。 (muruのコメントは、より深く議論される問題を指します)