2017-10-31 13 views
0

私はmakefileを初めて使用していて、いくつかのファイルをコンパイルしようとしています。Makefile - 2つのLibsのうちの1つだけを作成する

最初はs-chatと呼ばれ、その他はRWT(リーダライタ)とDP(食堂の哲学者)です。どちらも私のリストライブラリを使用していますが、s-chatは-m32フラグを付けてコンパイルする必要があります。

これは私がやろうとしたことです:lib-adders.o、lib_movers.o、lib_removers.oを使ってlibMonitor.aを1つ呼び出しました。もう1つは、lib_adders_32.o、lib_removers_32.o、lib_movers_32.oを使用するliblist_32です。何らかの理由で、これらの2つのライブラリのうちの最初のライブラリのみが作成され、もう1つは最初の依存関係が見つからないと言います。

PTHREADS = /student/cmpt332/pthreads 
RTT = /student/cmpt332/rtt 

CC  = gcc 
CFLAGS = -g 
CPPFLAGS = -std=c90 -Wall -pedantic 

.PHONEY: all clean 

ARCH = $(shell uname -sm | tr -d ' ') 

ifeq ($(ARCH),SunOS) 
ARCH = $(PLATFORM) 

PROCESSOR = "$(shell uname -p)" 
ifeq ($(PROCESSOR),i386) 
ARCH = i86pc 
endif 

endif 

all: s-chat reader-writer-test dining-philosophers-test 

RWT_OBJS = reader-writer_$(ARCH).o reader-writer-monitor_$(ARCH).o Monitor_$(ARCH).o libMonitor_$(ARCH).a 

reader-writer-test: CPPFLAGS += -I$(PTHREADS) 
reader-writer-test: LDFLAGS += -L$(PTHREADS)/lib/$(ARCH) 
reader-writer-test: LDLIBS += -lpthreads 
reader-writer-test: $(RWT_OBJS) 
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o [email protected] 

reader-writer_$(ARCH).o: reader-writer.c reader_writer_monitor.h Monitor.h 

reader-writer-monitor_$(ARCH).o: reader-writer-monitor.c reader_writer_monitor.h Monitor.h 

DP_OBJS = dining-philosophers_$(ARCH).o dining-philosophers-monitor_$(ARCH).o Monitor_$(ARCH).o libMonitor_$(ARCH).a 

dining-philosophers-test: CPPFLAGS += -I$(PTHREADS) 
dining-philosophers-test: LDFLAGS += -L$(PTHREADS)/lib/$(ARCH) 
dining-philosophers-test: LDLIBS += -lpthreads 
dining-philosophers-test: $(DP_OBJS) 
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o [email protected] 

dining-philosophers_$(ARCH).o: dining-philosophers.c dining_philosophers_monitor.h Monitor.h 

dining-philosophers-monitor_$(ARCH).o: dining-philosophers-monitor.c dining_philosophers_monitor.h Monitor.h 

Monitor_$(ARCH).o: Monitor.c Monitor.h 

list_adders.o: list_adders.c list.h 
list_movers.o: list_movers.c list.h 
list_removers.o: list_removers.c list.h 

libMonitor_$(ARCH).a: list_adders.o list_movers.o list_removers.o 
    ar rcs [email protected] $^ 


list_adders_32.o: CFLAGS += -m32 
list_adders_32.o: LDFLAGS += -m32 
list_adders_32.o: list_adders.c list.h 
list_movers_32.o: CFLAGS += -m32 
list_movers_32.o: LDFLAGS += -m32 
list_movers_32.o: list_movers.c list.h 
list_removers_32.o: CFLAGS += -m32 
list_removers_32.o: LDFLAGS += -m32 
list_removers_32.o: list_removers.c list.h 

liblist_32_$(ARCH).a: list_adders_32.o list_movers_32.o list_removers_32.o 
    ar rcs [email protected] $^ 

s-chat: CPPFLAGS += -I$(RTT)/include 
s-chat: CFLAGS += -m32 
s-chat: LDFLAGS += -L$(RTT)/lib/$(ARCH) -m32 
s-chat: LDLIBS += -lRtt -lRttUtils 
s-chat: s-chat.o liblist_32_$(ARCH).a 
s-chat.o: s-chat.c 

%_$(ARCH).o %_32_$(ARCH).o %.o %_32.o: %.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

%: %.o 
    $(CC) $(LDFLAGS) $(LDLIBS) $^ -o [email protected] 

clean: 
    rm -rf *.o *.a reader-writer-test dining-philosophers-test s-chat 

これは私が取得エラーです:

ar rcs libMonitor_Linuxx86_64.a list_adders.o list_movers.o list_removers.o 
ar: list_adders.o: No such file or directory 
Makefile:66: recipe for target 'libMonitor_Linuxx86_64.a' failed 
make: *** [libMonitor_Linuxx86_64.a] Error 1 

そして私は、S-チャット最後を作る場合、libMonitorを作ったが、私はliblist_32とまったく同じエラーを取得し、それはそれはできないと言うていますfind list_adders_32.o

何が起こっているのか、これを修正する方法を知っていますか?

ありがとうございます!

+0

btw:.PHONY' ... –

+0

私はよく分かりませんが、必要な行から '.c'ファイルを削除してください:' list_adders.o:list_adders.c list.h' => 'list_adders。 o:list.h'。 –

答えて

0

https://www.gnu.org/software/make/manual/make.html#Pattern-Intro

パターンルールは複数のターゲットを持っている場合は、ルールのレシピは、ターゲットのすべてを作るための責任があることを知っているします。レシピはすべてのターゲットを作成するために1回だけ実行されます。

%_$(ARCH).o %_32_$(ARCH).o %.o %_32.o: %.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

%_$(ARCH).o: %.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

%_32_$(ARCH).o: %.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

%.o: %.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

%_32.o: %.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

ようなものになる。しかし、それはあなたのソースのすべてのように思えるので、makeはすでに内蔵を持っている完全ので、あなただけのこれらのルールを削除することができ、いずれにしても同じディレクトリにあるべき規則の%.o: %.cのために。

関連する問題