2014-09-29 52 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