web-dev-qa-db-ja.com

MacOS-gcc / ldを使用してダイナミックライブラリを相対パスにリンクする方法

ダイナミックリンクを理解しようとしている場合は、 この質問 が興味深いと思われます。

その質問に対する答えの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);
}

makefile:

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

これまでのところ、すべてがうまく機能しています。コマンドプロンプトで作成してから./mainと入力すると、期待される出力が表示されます。

someFunction called with x=666

さて、少し混ぜたいと思います。メインディレクトリのサブディレクトリであるディレクトリhidelibを作成しました。そして、メイクファイルに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
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
16
leedm777

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

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

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

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

基本的に、あなたがやろうとしていることにはたくさんの選択肢があります。

7
wbyoung