2011-02-11 76 views
6

我必須使用各種CFLAGS從同一組* .c創建不同的* .o文件。我想用patsubst從相同的* .c文件生成不同的* .o文件。我正在做一些錯誤的事情,請幫忙(我想從同一組c源文件中生成一組包含($ <)_O0.o和另一個($ <)_O2.o)的目標文件:makefile上的patsubst

$(CC) $(CFLAGS_02) -c $< -o $(patsubst %.c,%_O2.o,$<) 

感謝

回答

16

使用patsubst使您要建立,然後使用不同的規則,對每種類型構建的對象的列表。

事情是這樣的:

SRC_FILES = source1.c source2.c 

OBJ_FILES_O0 = $(patsubst %.c,%_O0.o,$(SRC_FILES)) 
OBJ_FILES_O2 = $(patsubst %.c,%_O2.o,$(SRC_FILES)) 

CFLAGS_O0 := -O0 
CFLAGS_O2 := -O2 

all: $(OBJ_FILES_O0) $(OBJ_FILES_O2) 

$(OBJ_FILES_O0): %_O0.o: %.c 
    $(CC) $(CFLAGS_O0) -c $< -o [email protected] 

$(OBJ_FILES_O2): %_O2.o: %.c 
    $(CC) $(CFLAGS_O2) -c $< -o [email protected] 
+1

謝謝你這麼描述,我的想法。 – Sayan 2011-02-11 17:58:53

5

您也可以使用通配符在目錄中指定的所有文件。

如:

#Generic Makefile. 

CC := g++ 

LD := g++ 

CFLAGS := -c 

LDFLAGS := -L<path to lib> -l<libname> \ 

      -L<path to lib> -l>libname> \ 
      ...................... 

ifeq (${TARGETARCH}, debug) 

    CFLAGS += -g -O0 

elif 

    CFLAGS += -O4 -DNDEBUG 

SRCFILES := $(wildcard *.cpp) 

OBJFILES := $(patsubst %.cpp, %.o, ${SRCFILES}) 


all: main 

main: ${OBJFILES} 

    @echo "[Linking]"[email protected] 

    ${LD} ${LDFLAGS} ${OBJFILES} 

%.o: %.cpp 

    @echo "[Compiling]"[email protected] 

    ${CC} ${CFLAGS} $^ -o [email protected]