言い直された質問(すでに解決されていますが):
Linux で共有オブジェクト ライブラリをロードするために dlopen(3) を使用する際に問題が発生しました。このライブラリは、私が構築したライブラリのシステムの一部であり、実行時に中央の実行可能ファイルによってすべてロードされます。このすべては、Code::Blocks の単一のワークスペースに編成されます。各プロジェクトには、プログラムに同梱される Source と呼ばれるディレクトリ内の独自のフォルダーが与えられます。実行可能ファイルのビルド ディレクトリは、実行可能ファイルとソース フォルダーが同じディレクトリにあるように、独自のソース コードから 2 つ後ろのディレクトリです。ライブラリも実行可能ファイルと同じディレクトリにビルドされるので、当然ライブラリの名前を渡します私は示されているように開こうとしています:
int main(int argc, char** argv) {
void* hLibrary = dlopen("libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
if(hLibrary == NULL) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
return 0;
}
これは、ソース コードのディレクトリを上記の配置に変更するまで、ビルド ディレクトリがソース コードと同じだったある時点で機能していました。この時点での問題は、ファイルが明らかに存在し、実行可能ファイルと同じディレクトリにあるにもかかわらず、dlerror() が「libLibrary.so を開けません: そのようなファイルまたはディレクトリはありません」を返すことです。次に、代わりに「/libLibrary.so」を渡そうとしました。これは、dlopen(3) のマニュアル ページによると、/ を追加すると相対ディレクトリを示すためです。これは同じエラーを返しました。
これに対する解決策は、「./」が必要だったということでした。は、実行可能ファイルの作業ディレクトリを表します。この作業ディレクトリは、Code::Blocks で実行可能ファイルがビルドされる場所に変更する必要がありました。以下は完全に機能します。
void* hLibrary = dlopen("./libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
これは実際には完全な解決策を示しているわけではありませんが、以下は基本的に私がやっていることと同等です:
void* hLibrary = dlopen("./../../libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
うまくいけば、これで状況が少しよく説明されます。