2017-04-03 1 views
1

Makefileを実行して、同じgccコマンドでオブジェクトを作成しています。このファイルには、次のようになります。変数からオブジェクトを個別に生成

gcc -Wall -c read_line.c -o read_line.o 
gcc -Wall -c client.c -o client.o 

しかし、私はどのように行うのか分からない、と私はテストしたすべてが機能していません。

SRCLIB = main.c srv.c 
OBJLIB = main.o srv.o 
CC = gcc 
CCFLAGS = -Wall -Werror 

$(OBJLIB) : $(SRCLIB) 
    $(CC) $(CCFLAGS) -c $^ -o [email protected] 

objetiveはこのように実行することです。 Makefileでこれを行うことも可能ですか?

答えて

1

変数が展開された後、あなたのメイクファイルは、このように展開:メイクで

main.o srv.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 

を、このような明示的なルールで複数のターゲットを使用すると、ターゲットごとに一回、ルールを複数回の書き込みと同じです。だから、これはこれと同じです。

main.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 
srv.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 

これは、ソースファイルの変更のいずれかの場合(各オブジェクトは両方のソースだけでなく、自分自身のソースファイルに依存するため)、BOTHオブジェクトファイルが再作成されることを意味します。

さらに、コンパイル行では、変数$^を使用して、すべての前提条件を拡張します。だからあなたのコンパイル行が展開された:あなたは-oオプションで-cを使用する場合にのみ、一つのソースファイルをコンパイルすることができます:違法である

gcc -Wall -Werror -c main.c srv.c -o main.o 
gcc -Wall -Werror -c main.c srv.c -o srv.o 

Makeには、ファイルをコンパイルする方法をすでに知っている組み込みルールがあり、独自のルールを書く必要はありません。これを書くことができます:

SRCLIB = main.c srv.c 
OBJLIB = main.o srv.o 
CC = gcc 
CCFLAGS = -Wall -Werror 

.PHONY: all 
all: $(OBJLIB) 

これだけです。

+0

あなたは正しいです、それは私の問題でした。私はあなたが言ったことをした、それは魅力のように働いた、ありがとう! – captainepoch

関連する問題