2014-09-29 136 views
1

我一直在尋找一個Makefile來編譯一個包含大量C和C++文件的巨大項目。我已經使用Eclipse來成功編譯它,但是我想要去一個獨立的Makefile。 我發現這個通用的Makefile與我的項目非常吻合,除了它只能編譯C或C++文件,但在一次運行中不能同時運行......所以它在鏈接時失敗。Makefile構建C和CPP文件

原Makefile中編譯CPP或C的位:

 SRC_EXT = cpp 
     OURCES = $(shell find $(SRC_PATH)/ -name '*.$(SRC_EXT)' -printf '%[email protected]\t%p\n' \ 
     SOURCES = $(shell find $(SRC_PATH)/ -name '*.$(CPP_EXT)' -o -name '*.$(C_EXT)' -printf '%[email protected]\t%p\n' \ 
          | sort -k 1nr | cut -f2-) 
     # fallback in case the above fails 
     rwildcard = $(foreach d, $(wildcard $1*), $(call rwildcard,$d/,$2) \ 
           $(filter $(subst *,%,$2), $d)) 
     ifeq ($(SOURCES),) 
      SOURCES := $(call rwildcard, $(SRC_PATH)/, *.$(SRC_EXT)) 
     endif 
OBJECTS = $(SOURCES:$(SRC_PATH)/%.$(SRC_EXT)=$(BUILD_PATH)/%.o) 
DEPS = $(OBJECTS:.o=.d) 

我試圖修改爲:

SRC_EXT = cpp c 
SOURCES = $(shell find $(SRC_PATH)/ -name '*.$(CPP_EXT)' -o -name '*.$(C_EXT)' -printf '%[email protected]\t%p\n' \ 
        | sort -k 1nr | cut -f2-) 
# fallback in case the above fails 
rwildcard = $(foreach d, $(wildcard $1*), $(call rwildcard,$d/,$2) \ 
         $(filter $(subst *,%,$2), $d)) 
ifeq ($(SOURCES),) 
    SOURCES := $(call rwildcard, $(SRC_PATH)/, *.$(SRC_EXT)) 
endif 

,但我不知道該怎麼做與物體指令使它與多個擴展名一起工作:

OBJECTS = $(SOURCES:$(SRC_PATH)/%.$(SRC_EXT)=$(BUILD_PATH)/%.o) 

有人可以幫忙嗎?

感謝

回答

0

首先,.o更換.cpp,然後通過.o替換剩餘.c

+0

感謝您的回答。我不確定你的意思。你的意思是我應該首先編譯CPP文件然後C文件?你能否詳細說明一下? – Arn 2014-09-29 20:52:42

+0

不,我的意思是在Makefile中分配OBJECTS變量的行中,發生文件名替換的文本 - 後綴SRC_EXT被替換爲後綴「.o」。你需要用「.o」替換兩個後綴。 – Sebastian 2014-09-30 23:20:31

+0

我明白了。有關我應該怎麼做的任何建議?使用&&不會做到這一點,它幾乎是我寫的第一個複雜的Makefile。我怎樣才能把它們結合起來 – Arn 2014-10-01 00:31:39