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