求教一个makefile问题

周靖峰 无业游民  2013-02-04 02:49:15

VISIONAPP_DIR = /home/server/zjf/workspace/visionapp

INCLUDE_DIR = \
$(VISIONAPP_DIR)/API \
$(VISIONAPP_DIR)/API/IPUcommon \
$(VISIONAPP_DIR)/foundation \
$(VISIONAPP_DIR)/Device \
$(VISIONAPP_DIR)/system \
$(VISIONAPP_DIR)/system/lua_inc
SRC_DIR = \
$(VISIONAPP_DIR)/API \
$(VISIONAPP_DIR)/system \
$(VISIONAPP_DIR)/foundation \
$(VISIONAPP_DIR)/Device
OBJ_DIR = ./obj
LIB_DIR = ./lib

OUTPUT = libvisionapp.a
#OUTPUT = main
SRCS = $(wildcard $(addsuffix /*.cpp, $(SRC_DIR)))
#SRCS = $(SRC_DIR)/main.c
OBJS = $(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(SRCS))))
LIBS = $(wildcard $(addsuffix /*.a, $(LIB_DIR)))
INCLUDES = $(wildcard $(addsuffix /*.h, $(INCLUDE_DIR)))

MKDIR = mkdir
CROSS = arm-hismall-linux-
CC = $(CROSS)g++
CFLAGS = -Wall -g -I $(INCLUDE_DIR)
LDFLAGS = -L $(LIB_DIR)
AR = $(CROSS)ar
ARFLAGS = cqs
RM = rm
RMFLAGS = -rf

.PHONY : all clean MKDIR

all : $(OBJ_DIR) $(OUTPUT)

$(OBJ_DIR) :
$(MKDIR) $@
@echo $(SRCS)
@echo $(OBJS)
@echo $(INCLUDES)

$(OUTPUT) : $(OBJS)
$(AR) $(ARFLAGS) $@ $(OBJS)
#$(OUTPUT) : $(OBJS) $(LIBS)
# $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)

$(OBJ_DIR)/%.o : $(addsuffix /%.cpp, $(SRC_DIR)) $(INCLUDES)
$(CC) $(CFLAGS) -o $@ -c $<

clean :
$(RM) $(RMFLAGS) $(OBJ_DIR) $(OUTPUT)


这是小弟写的makefile文件,问题出在第57行,也就是

$(OBJ_DIR)/%.o : $(addsuffix /%.cpp, $(SRC_DIR)) $(INCLUDES)


其中OBJ_DIR是当前目录下的obj文件夹
SRC_DIR有很多文件夹
直接写成

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(INCLUDES)

肯定不行,因为SRC_DIR扩展后,只有最后一个文件夹能匹配,前面几个文件夹都不会带上.cpp

所以我就想出这个方法
$(OBJ_DIR)/%.o : $(addsuffix /%.cpp, $(SRC_DIR)) $(INCLUDES)

第二部分在SRC_DIR中的所有目录后面加上/%.cpp,这样按道理就应该能匹配了

但现实是,这样做是错误的,我不知道到底哪里出错了,求高手指点
...全文
105 2 点赞 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
daviddb7 2013-02-05

$(OBJDIR)%.o: %.cpp

vpath %.cpp $(SRC_DIR)
试试
  • 打赏
  • 举报
回复
ljhnew 2013-02-04
有必要写这么复杂吗? 整个makefile可以简单化,能解决问题就可以 gmake的makefile,可以用类似 $(OBJ):$(OBJDIR)%.o:$(SRCDIR)system/%.cpp 格式来进行自动推导,即两个冒号
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2013-02-04 02:49
社区公告
暂无公告