2

ヘッダー ファイルを使用libdependentして、特定のエクスポートされた関数を使用する共有ライブラリを作成したいと考えています。libparent

ビルド段階ではのパスlibparentがわからないため、 を使用できず、代わりに実行時にandrpathを呼び出します。dlopen("path/libparent.so", RLTD_NOW | RTLD_GLOBAL)dlopen("path/libdependent.so", RLTD_NOW | RTLD_GLOBAL)

しかし、リンク中にライブラリ検索パスに入れて使用するとlibparent、 in libdependentfileへの参照はまったくありません。libparent.so-lparent

しようとすると、設定されdlopen libdependentていても「シンボルが見つかりません」というエラーが表示RTLD_GLOBALされます。

libparentを呼び出さずにエクスポートを使用するにはどうすればよいdlsymですか?

4

2 に答える 2

1

まず、ライブラリを作りたい時はインポートしなくていいので、

dlopen("path/libdependent.so", RLTD_NOW | RTLD_GLOBAL)

必要ありません。

次に、使用するライブラリ (libparent) の名前が正確にわからない場合は、動的リンクとdlopenを使用する必要があります。動的リンクでは、libparent ライブラリについてリンカーに通知する必要はありませんが、動的リンカー ライブラリを使用する必要があるため、リンカー コマンドは次のようになります。

g++ -o 出力 -dl 入力.cpp

dlは、 dlopenを使用すると言っています。

プログラムを使用するときは、実行中のディレクトリから libparent.so が見えるようにしてください (または絶対パスを使用してください)。また、dlopen の戻り値を確認して、ライブラリのオープンが成功したかどうかを確認してください。

    void *handle = NULL;
    handle = dlopen("libparent.so", RTLD_LAZY);
    if(!handle){
        printf("Error!\r\n");
    }

それが役に立てば幸い。

于 2013-09-10T07:54:10.577 に答える
0

-sharedリンカーオプションに追加し、 でライブラリを指定することで解決しました-l-(も役立ちます。

于 2013-09-10T10:58:01.733 に答える