2011-03-04 45 views
3

我有這個目錄結構。自動生成目標來源列表製作文件

app/ 
    src 
    include 
    lib/ 
     src 
    maincode/ 
      main.cc 
      Makefile 

我想從makefile中的源列表生成自動目標。所以我不必爲每個文件寫規則。

source=\ 
     ../src/a.cpp 
     ../src/ab.cpp 
     ../lib/src/b.cpp 

我想寫規則像

%.o:%.cpp 

,這樣我就不必重複規則爲每個文件。 我怎麼能做到這一點?

回答

7

編輯:find命令應該是可變

殼裏面如果你使用的是Linux,我想你可以使用:

SOURCES=$(shell find . -name *.cpp) 
OBJECTS=$(SOURCES:%.cpp=%.o) 

%.o: %.cpp 
    <command to compile> 
+0

我使用這種類型 的SourceFile = \ \t $(SRC_DIR)/vinit.cc \ \t $(SRC_DIR)/vout.cc \ OBJECTS = $(的資源文件:%CC =%。 o)\t 但它不能正常工作 – 2011-03-04 14:48:14

+0

你可以發佈你正在得到的錯誤? – Sagar 2011-03-04 14:51:00

+0

我沒有收到任何錯誤。 但目標沒有被調用 %.o:%.cc @echo「here」 它沒有被調用 – 2011-03-04 17:19:06

2

我喜歡薩格爾的答案,但我花了位弄清楚我想我什麼額外的規則,以使創建的對象:

SOURCES=$(shell find . -name *.cpp) 
    OBJECTS=$(SOURCES:%.cpp=%.o) 

    all: $(OBJECTS) 

    %.o: %.cpp 
     <command to compile dependencies $< into target [email protected] > $< -o [email protected] 
1
CPP  = g++ 
CPPFLAGS = -Wall -pedantic -O2 -g -c 

SOURCES := ${wildcard *.cpp} 
OBJECTS := ${SOURCES:.cpp=.o} 

.PHONY: all clean 

.SUFFIXES: .cpp .o 

all:  main 

main:  $(OBJECTS) 

.cpp.o: 
    $(CPP) $(CPPFLAGS) $< -o [email protected] 

clean: 
    -rm -fv *.o 

欲瞭解更多信息見the man

+2

公約規定所有'CPP'的實例都應該用'CXX'替代。這是因爲makefile中的'CPP'實際上通常意味着'C''''''''''處理器,而不是C++。 'CXX'被認爲是C++。此處顯示的標誌「CPPFLAGS」不適用於預處理器,而適用於編譯器本身。當然,它實際上並不重要,你稱之爲變量 - 你可以稱它們爲「BERT」和「ERNIE」 - 但是約定只在人們關注它們時纔有用! – 2015-09-15 19:37:00