ダイナミックリンクを理解しようとしている場合は、 この質問 が興味深いと思われます。
その質問に対する答えの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
有効な具体的なオプションの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
ライブラリの検索パスに追加する-L
コンパイラ/リンカーフラグがおそらく必要です。
リンク後に物事を移動しようとしている場合は、検索する場所にdyld
環境変数が必要になります。 man dyld
と、DYLD_LIBRARY_PATH
およびその他の環境変数に関する詳細情報を取得できるはずです。
ただし、通常は、-install_name
リンカーフラグを値として@rpath/mylibrary.dylib
のようなものにリンクする前に、ライブラリのインストール名を設定し、コンパイル中にメインの実行可能ファイルに実行パス検索パスを設定します。 -rpath
フラグを@executable_path/hidelib
に設定します。
詳細については、install_name_tool
およびld
の-rpath
&-install_name
引数を参照してください。
基本的に、あなたがやろうとしていることにはたくさんの選択肢があります。