2014-01-29 277 views
2

我正在編寫一個Makefile來編譯一個很長的項目。 Basicaly,我已經定義了我需要的所有對象。 當我需要生成依賴關係時,問題就出現了。 我在做這樣的事情:爲gcc生成依賴關係

a.o: $($(CXX) -MM $(INCLUDE) A/a.cpp | sed 's/a.o: //') 
$(CXX) $(CXXFLAGS) $(INCLUDES) A/a.cpp 

b.o: $($(CXX) -MM $(INCLUDE) A/b.cpp | sed 's/b.o: //') 
$(CXX) $(CXXFLAGS) $(INCLUDES) A/b.cpp 

libab.a: a.o b.o 
$(LXX) $(LXXFLAGS) libab.a a.o b.o 

的輸出 「$(CXX)-MM $(含)A/a.cpp | sed的 'S/AO://'」 列出了所有的依賴關係a.cpp需要編譯,所以我試圖把這個命令的輸出像依賴關係一樣,當我聲明對象但它不工作時。

你有關於如何做的想法嗎?

謝謝。

回答

0

爲什麼你想刪除目標前綴,這正是你已經手動輸入?

反而只包括整個依賴文件。

-include $(ALL_CPP_FILES:%.cpp=%.d) 

我通常的標誌來自動生成.d(依賴)的文件是:

CPPFLAGS+=-MMD # automatic .d dependency file generation 

這就好比-MD,除了它僅提到用戶頭文件,而不是系統的頭文件。

樣品:

# BUILD=RELEASE 

PRJNAME=demo 
# 
TARGETS+=bin/test 

build: \ 
    $(TARGETS) \ 
    tags 

all: build 

clean: 
    rm -rf bin/* $(ALL_OBJ_FILES) 
    rm -rf $(ALL_CPP_FILES:%.cpp=%.d) 

############################## 
# definition 
CC=gcc 
CXX=g++ 

CPPFLAGS+=-MMD # automatic .d dependency file generation 
CPPFLAGS+=-std=c++11 

ifeq ($(BUILD),RELEASE) 
    CPPFLAGS+=-g -O3 
    CPPFLAGS+=-march=native 
else 
    CPPFLAGS+=-g -O0 
    CPPFLAGS+=-DDEBUG -D_DEBUG 
    CPPFLAGS+=-DUNIT_TESTS 
endif 

CPPFLAGS+=-Wall -Wextra -pedantic 
#CPPFLAGS+=-Werror 

LDFLAGS+=-lpthread 

ALL_CPP_FILES=A/a.cpp A/b.cpp 
ALL_OBJ_FILES=$(patsubst %.cpp,%.o,$(ALL_CPP_FILES)) 

############################## 
tags: $(ALL_CPP_FILES) 
    ctags -R A/ 

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

############################## 
# tool targets 
bin/test: $(ALL_OBJ_FILES) 
    mkdir -pv $(@D) 
    $(CXX) $^ $(LDFLAGS) -o [email protected] 

.PRECIOUS: S(ALL_OBJ_FILES) 
.PHONY: clean all build 

-include $(ALL_CPP_FILES:%.cpp=%.d) 
+0

我添加了一個簡單的骨架的Makefile,從我實際使用減少。希望這可以幫助。 – sehe

+0

非常感謝sehe! – lithetails

+0

你可以修改一下你的示例來創建庫嗎?對不起,但我很迷茫,這:( – lithetails