動的ライブラリ (LINUX の共有ライブラリ) を生成する複数のプロジェクトで構成されるアプリケーションをコンパイルしています。もちろん、そのさまざまなプロジェクトは、私がコンパイルした他のプロジェクトにリンクしています。GCCコンパイラを使用して、UbuntuでCodeBlocks 10を使用しています。
ユーザーによって指定された引数に従って、さまざまなライブラリがロードされるという事実により、私のメインアプリケーションでは、決定に従って、次の行で適切なライブラリをロードしています。
dll = dlopen("my_library.so", RTLD_LAZY);
ドキュメントで指定されているように、ライブラリに他の共有ライブラリへの依存関係があり、プロセスが再帰的に行われる場合、dlopen は自動的にライブラリをロードします。
問題は、dlopen の直後に、何が起こっているのかを理解するために dlerror() を呼び出すと、次のエラーが発生することです。
../../../../gccDebug/os.so : 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません。
エラーを見るだけで、必要以上に2つ下のフォルダーを見ているので、完全に理解しています。問題はなぜですか?
つまり、相対パスを使用して、プロジェクトに共有ライブラリを明示的にロードします。私のメイン アプリケーションでは、ワーキング ディレクトリは ../../gccDebug です。dlopen、mylibrary.so を使用してロードします。これは (プロジェクトのオプションで) ../../gccDebug/gui.so を明示的にロードします。この gui.so は、(プロジェクト オプションで) ../../gccDebug/so.os も明示的にロードします。
それが起こっているように私には思えますが、彼はパスを追加していて、3回目の「反復」で、必要以上に多くのフォルダーをすでに検索しているパスを探しているということです。最初の再帰的読み込み (gui.so) が正常に機能する場合、2 回目の再帰的読み込み (so.os) が奇妙なパスを与えるのはなぜですか??
dlopen 関数を使用した共有ライブラリの再帰的ロードの何が問題になっていますか?