2015-04-04 91 views
1

並感謝您的時間。我有下面的Makefile:在Makefile中創建對象

CXX  = g++ 
CXXFLAGS = -Wall -g 
SOURCES := divisor.cpp multiplier.cpp 
OBJECTS := ${SOURCES:.cpp=.o} 

%.o: %.cpp 
     $(CXX) -c $(CXXFLAGS) $< -o [email protected] 

%: %.o $(OBJECTS) 
     $(CXX) $(CXXFLAGS) [email protected] -o [email protected] 

$(OBJECTS): %.o: %.cpp 
     $(CXX) -c $(CXXFLAGS) $< -o [email protected] 
clean: 
     rm -f *.o 

我想這個make文件什麼是以下幾點: 如果我叫123.cpp源文件添加到工作目錄,我想它來生成目標文件,然後鏈接編譯在$(SOURCES)指定人士稱,這意味着:

g++ -c -Wall -g 123.cpp 
g++ multipler.o divisor.o 123.o -o 123 

如果multiplier.cppdivisor.cpp必須生成或更新,我想作這樣做。

但我失敗了,因爲divisor.omultiplier.o不是自動生成

我怎麼可能做到這一點?

編輯

只是爲了澄清,有兩種類型的工作目錄中的源代碼文件:divisor.cppmultipler.cpp是一類,其他任何文件,比方說,123.cpp是另一種類型。從某種意義上說,divisor.cppmultiplier.cpp是其他源文件的必備條件。

我要自動編譯先決條件的過程和編譯其他文件

g++ -c multiplier.cpp 
g++ -c divisor.cpp 
g++ -c -Wall -g 123.cpp 
g++ multipler.o divisor.o 123.o -o 123 
+1

首先,你有沒有規則取決於''(SOURCES)''的地方。你需要類似於你用$'(OBJECTS)''' – BitTickler 2015-04-04 17:53:19

+1

做的事情。你沒有根據'$(OBJECTS)'指定任何最終目標? – 2015-04-04 17:56:25

+0

目標'$(OBJECTS)'不會隱式地作爲'$(SOURCES)'的規則嗎? 取決於'$(OBJECTS)'的最終目標不是'%:%。$ $(OBJECTS)'? 謝謝 – Jorge 2015-04-04 17:59:37

回答

1

使用wildcard功能時將它們鏈接:

SOURCES := $(wildcard *.cpp) 

然後,你可以刪除你的「特殊」源文件:

SPECIAL_SOURCES := divisor.cpp multiplier.cpp 
SOURCES := $(filter-out $(SPECIAL_SOURCES),$(SOURCES)) 

並改變你的規則來建立你真正想要的東西:

$(SPECIAL_OBJECTS) := $(SPECIAL_SOURCES:.cpp=.o) 
$(BINARIES) := $(patsubst .cpp,,$(SOURCES)) 

$(SPECIAL_OBJECTS) : %.o : %.cpp 
    $(CXX) $(CXXFLAGS) -c -o [email protected] $^ 

$(BINARIES) : % : %.cpp $(SPECIAL_OBJECTS) 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ 
+0

謝謝,請參閱編輯。 – Jorge 2015-04-05 11:20:22

+0

@Jorge - 編輯來解決你想要的行爲。 – 2015-04-05 14:34:33

+0

謝謝,我儘快嘗試一下:) – Jorge 2015-04-06 10:53:18