2016-12-23 29 views
0

Makefileに動的ライブラリと静的ライブラリを作成する方法。私はCコードを持っています。 incフォルダには、すべてのヘッダファイルが含まれており、このフォルダの外にCファイルが含まれています。 .aと.soライブラリを作成したいと思います。すべてのファイルが実行されることを示すワイルドカードを含めるにはどうすればよいですか? 私はこのようにしました。 ( - 私は通常ruvを使用arruまたはその近辺)Makefileに静的ライブラリと動的ライブラリを作成する方法は?

CFLAGS := -fPIC -O3 -g -Wall -Werror 
CC := gcc 
MAJOR := 0 
MINOR := 1 
NAME := foo 
VERSION := $(MAJOR).$(MINOR) 

lib: lib$(NAME).so 

lib$(NAME).so.$(VERSION): $(NAME).o 
    $(CC) -shared -Wl,-soname,lib$(NAME).so.$(MAJOR) $^ -o $(wildcard %.c) 

clean: 
    $(RM) *.o *.so* 
+0

投稿されたメイクファイルは、.soライブラリのみを生成します。 'all:lib $(NAME).so。$(VERSION)lib $(NAME).a。$(VERSION)'のような最初のターゲットを追加する必要があります。 $(NAME).a。$(VERSION) – user3629249

答えて

2
CFLAGS := -fPIC -O3 -g -Wall -Werror 
CC := gcc 
MAJOR := 0 
MINOR := 1 
NAME := foo 
VERSION := $(MAJOR).$(MINOR) 

LIBSO = lib$(NAME).so 
LIBSOM = $(LIBSO).$(MAJOR) 
LIBSOV = $(LIBSO).$(VERSION) 
LIBA = lib$(NAME).a 

lib: $(LIBSO) $(LIBA) 

$(LIBSO): $(LIBSOV) 
    ln -s $(LIBSOV) $(LIBSO) 

$(LIBSOV): $(NAME).o 
    $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIBSOM) -o $(LIBSOV) $(NAME).o 

$(LIBA): $(NAME).o 
    $(AR) $(ARFLAGS) $(LIBA) $(NAME).o 

clean: 
    $(RM) *.o *.so* 

チェックはマクロARARFLAGSが適切に設定されていることを確認します。

オブジェクトファイルが1つだけある理由はわかりません。実際には、ディレクトリ内のすべてのCソースファイルをオブジェクトファイルにコンパイルしてライブラリに含めるかどうかはわかりません。共有オブジェクトのリンクコマンドは整形されていない(最初の.cファイルを作成した共有オブジェクトとして上書きしてしまいます)。

あなたはライブラリ内の複数のオブジェクト・ファイルが必要な場合は、定義:

SOURCE := $(wildcard *.c) 
OBJECT := $(SOURCE:.c=.o) 

やルールに$(NAME).oの代わりに$(OBJECT)を使用します。個人的には、私はワイルドカードを信用していません - 私の快適のためにテストプログラムのコードなどがライブラリに含まれている危険性があまりありません。 YMMV。

+0

ありがとうございます:) – Dulguuntur

関連する問題