2012-04-05 36 views
15

動的リンクを理解しようとしている場合は、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 

答えて

13

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

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 
7

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

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

一般的に、しかし、あなたは-rpathフラグを指定してコンパイル中にメインの実行ファイルで、実行パスの検索パスを設定し、その後、値として@rpath/mylibrary.dylibのようなものに-install_nameリンカフラグで何かにリンクする前に、ライブラリの名前をインストールし設定します〜@executable_path/hidelib。詳細については

ldinstall_name_tool-rpath & -install_name引数を参照してください。

基本的には、何をしようとしているのかに関する多くのオプションがあります。

関連する問題