2012-02-29 111 views
0

我試圖用make prog1make prog2構建兩個帶有一個GNU Makefile的程序。我試圖使用特定於目標的變量來指定目標專用的源文件,但test1.c和test2.c都已經編譯完成。它們僅在鏈接可執行文件時引用。如何讓Makefile編譯test1.c或test2.c?GNU Make包含來自目標特定變量的源文件

下面是我的Makefile中摘錄:

... 
prog1: PASRC = test1.c 
prog2: PASRC = test2.c 
... 
ASRC = $(PASRC) common.c 
... 
OBJS = $(ASRC:.c=.o) 
... 
prog1: $(OBJS) prog1.elf 
prog2: $(OBJS) prog2.elf 
... 
%elf: $(OBJS) 
    $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o [email protected] 

在此先感謝您的幫助

回答

2

無需使用特定目標變量。普通的依賴應該是足夠了:

all : prog1 prog2 # default target 

prog1 : test1.o 
prog2 : test2.o 
prog1 prog2 : common.o 

%.o : %.C# how to build any .o from a corresponding .c 
    $(CC) -c -o [email protected] $(CPPFLAGS) $(CFLAGS) $< 

prog1 prog2 : % : 
    $(CC) $^ $(LDFLAGS) $(LDLIBS) -o [email protected] 
0

除非你有某種形式的,你沒有說,我建議讓湊合爲您的工作(默認規則和標誌)的具體要求。

PROGS = prog1 prog2 
COMMON_OBJS = common.o 

all: $(PROGS) 
prog1 prog2: % : %.o $(COMMON_OBJS) 

clean: 
     rm -f $(PROGS) $(PROGS:%=%.o) $(COMMON_OBJS) 

您仍然可以設置CLFAGS,LDFLAGS等(在命令行或在makefile)和默認規則將它們撿起來。

如果您使用的GNU讓你可以通過運行看到所有的生成和自動規則:

make -n -p 

這是一個很大的輸出,所以我建議管道它到您選擇的尋呼機。