18

動的リンクを理解しようとしている場合、この質問は興味深いものになる可能性があります。

その質問に対する答えの 1 つは、動的ライブラリを作成して使用する素晴らしい例です。それに基づいて、いくつかの単純なファイルを作成します。

main.c:

extern void someFunction (int x);

int main (int argc, char** argv ) {
    someFunction(666);
}

mylibrary.c:

#include <stdio.h>

void someFunction (int x) {
    printf ("\nsomeFunction called with x=%d\n", x);
}

メイクファイル:

main: mylibrary.c main.c
    gcc -c mylibrary.c
    gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
    gcc -c main.c
    gcc -v main.o ./libmylibrary.dylib -o main

clean:
    rm *.o
    rm main
    rm *.dylib

これまでのところ、すべてがうまく機能しています。make を実行し、コマンド プロンプトで ./main と入力すると、期待どおりの出力が表示されます。

someFunction called with x=666

さて、少し混ぜてみたいと思います。メイン ディレクトリのサブディレクトリである hidelib ディレクトリを作成しました。そして、makefile に次の 1 行を追加します。

main: mylibrary.c main.c
    gcc -c mylibrary.c
    gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
    gcc -c main.c
    mv libmylibrary.dylib hidelib     # this is the new line

clean:
    rm *.o
    rm main
    rm hidelib/*.*

ここで、makefile に別の行を追加して、hidelib サブディレクトリで libmylibrary.dylib を検出するようにします。./main も同じように実行できるようにしたいです。どうやってやるの?

編集:返信ありがとうございます。多くのオプションがあることは素晴らしいことですが、初心者は機能する具体的なオプションが 1 つだけ必要です。これが最後の行で私が試みていることですが、明らかに何かがわかりません。makefile はエラーなしで実行されますが、実行時に「ライブラリが見つかりません」と表示されます。

    gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main
4

2 に答える 2

17

機能する具体的なオプションの 1 つはinstall_name、 をリンクするときにフラグを設定すること.dylibです。

gcc -dynamiclib -install_name '$(CURDIR)/hidelib/libmylibrary.dylib' -current_version 1.0 mylibrary.o -o libmylibrary.dylib

次に、通常どおりライブラリにリンクできます。

gcc main.o -L '$(CURDIR)/hidelib' -lmylibrary -o main
于 2012-04-13T14:42:56.427 に答える
7

おそらく-L 、ライブラリの検索パスに追加するコンパイラ/リンカー フラグが必要です。

リンク後に移動しようとしている場合はdyld、検索する場所の環境変数が必要になります。およびその他の環境変数man dyldに関する詳細情報を取得できるはずです。DYLD_LIBRARY_PATH

ただし、通常は、-install_nameリンカーフラグを使用して何かにリンクする前にライブラリのインストール名を値として設定し、フラグを@rpath/mylibrary.dylib使用してコンパイル中にメインの実行可能ファイルの実行パス検索パスを設定します。-rpath@executable_path/hidelib

詳細についてはinstall_name_tool、 および の-rpath&-install_name引数を参照してくださいld

基本的に、やろうとしていることには多くのオプションがあります。

于 2012-04-05T01:56:38.800 に答える