2017-06-06 23 views
-1

私は共有ライブラリ(.so, .dylib)をMakefile gccに作成したい) 私のライブラリには他の共有ライブラリからの参照ライブラリ)Makefileとgccを使用して動的共有ライブラリ(.so、.dylib)を構築する

私は、このようなディレクトリ構造を持っている:。
enter image description here

:私は、このようなディレクトリ構造を持っている私の /comparersディレクトリ内

/c/ 
    /Project1/... 
    /Project2/... 
    ... 
    /unit_tests/... 
    /comparers/... 

を私がする比較器の共有ライブラリに依存する共有ライブラリをunit_testコンパイルするために試してみました

はこのようなものを作る:

$(SHARED_LIBRARY): assertion.o 
    $(CC) $(CFLAGS) -shared -o $(OUTPUT_LIB_DIR)/$(SHARED_LIBRARY) $(OUTPUT_DIR)/assertion.o $(COMPARERS_SHARED_LIB_PATH) 

COMPARERS_SHARED_LIB_PATH= ../comparers/output/debug/lib/libcomparers.so 

しかし、私は静的ライブラリを使用する場合、それは動作しません。代わりに正しくコンパイルされます。なぜこれがうまくいかず、正しく動作させる方法は?

UPDATE:エラーメッセージ

上記は、正しく構築されたが、私はそれは、実行時にエラーが発生すると仮定します!私は私の実行ファイルが、それはまたのビルドターゲットが、実行しているとき、それは、このようなエラーメッセージを与えるのと同じ方法リンクする場合:

dyld: Library not loaded: output/debug/lib/libcomparers.so 
    Referenced from: /Users/michzio/Developer/MyProjects/BachelorDegree/c/unit_tests/./output/debug/bin/unit_tests 
    Reason: image not found 
Abort trap: 6 
+0

「動作しません」あまり役に立たない... –

+0

エラーメッセージをそのまま投稿してください。 –

答えて

0

あなたはエラーメッセージを投稿しませんでしたが、すぐに明らかにされているいくつかのエラーがあります。

1つのエラーは、パスの有無にかかわらずファイル名を組み合わせて一致させることです。例えば。 $(SHARED_LIBRARY)$(OUTPUT_LIB_DIR)/$(SHARED_LIBRARY)とは異なり、assertion.o$(OUTPUT_DIR)/assertion.oとは異なります。あなたはそのような間違いを防ぐためにGNU make's automatic variablesの使い方を学ぶ必要があります。

別のエラーは、別の共有ライブラリにリンクする方法です。実行時リンカーは../comparers/output/debug/lib/libcomparers.soを検索し、そのパスは現在のディレクトリが特定のものである場合にのみ有効です。

通常、リンクはLDFLAGSで、CFLAGSではありません。

一つの修正は可能性:生産ビルドの

COMPARERS_SHARED_LIB_PATH := $(abspath ../comparers/output/debug/lib/libcomparers.so) 

$(OUTPUT_LIB_DIR)/(SHARED_LIBRARY): $(OUTPUT_DIR)/assertion.o $(COMPARERS_SHARED_LIB_PATH) 
    $(CC) -shared -o [email protected] $(LDFLAGS) $^ 

をしかし、それは、実行時リンカーは、そのユーザーに対する必要な共有ライブラリを見つけたように、$ORIGIN相対パスを使用して、他の共有ライブラリに-rpathを指定する必要があります。完全なパスではなく、-L<path> -l<lib>を使用してその共有ライブラリにリンクします。

関連する問題