動的リンクを理解しようとしている場合は、this questionが重要です。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);
}
は、メイクファイル:
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行を追加している:それはhidelibサブディレクトリにlibmylibrary.dylibありますので
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/*.*
は今、私はメイクファイルに別の行を追加します。 ./mainを同じ方法で実行できるようにしたい。どうやってやるの?
編集:お返事ありがとうございます。たくさんのオプションがあるのはすばらしいですが、初心者は動作する1つの具体的なオプションがほしいだけです。ここで私は最後の行をしようとしているが、明らかに何かを理解していない。 makefileはエラーなしで実行されますが、実行時には "library not found"と表示されます。
gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main