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)
有人可以幫忙嗎?
感謝
感謝您的回答。我不確定你的意思。你的意思是我應該首先編譯CPP文件然後C文件?你能否詳細說明一下? – Arn 2014-09-29 20:52:42
不,我的意思是在Makefile中分配OBJECTS變量的行中,發生文件名替換的文本 - 後綴SRC_EXT被替換爲後綴「.o」。你需要用「.o」替換兩個後綴。 – Sebastian 2014-09-30 23:20:31
我明白了。有關我應該怎麼做的任何建議?使用&&不會做到這一點,它幾乎是我寫的第一個複雜的Makefile。我怎樣才能把它們結合起來 – Arn 2014-10-01 00:31:39