我的文件列表如下:
fd1/foo.c
fd2/foo.c
fd2/bar.c
fd2/bar.h
我想编译fd1 / foo.c和fd2 / bar.c。 fd2 / foo.c是一个被排除在外的人。如果我使用vapth选择所有源文件,将编译fd2 / foo.c.所以我想指定源列表:
SRC_C = fd1/foo.c fd2/bar.c
由于我无法使用vpath,所以我只能编译SRC_C:
SRC_O = $(patsubst %.c,%.o,$(SRC_C))
SRC_C_LIST = $(notdir $(SRC_C))
OBJ_LIST = $(patsubst %.c,%.o,$(SRC_C_LIST) )
.PHONY: all
all: $(OBJ_LIST)
ar rvs foobar.a $(OBJ_LIST)
$(SRC_O): %.o : %.c
gcc -c $< -I inc/ -MM -MF $(patsubst .o,.d,$(notdir $@)) -o $(notdir $@)
但我也想要添加依赖规则。但是依赖文件似乎只包含没有原始文件夹名称的对象目标:
foo.o : src/foo.c inc/bar.h
在这种情况下如何使用依赖文件?感谢。
根据Joachim的建议,我修改我的解决方案如下。似乎工作:
SRC_C = fd1/foo.c fd2/bar.c
SRC_O = $(patsubst %.c,%.o,$(SRC_C))
SRC_C_LIST = $(notdir $(SRC_C))
OBJ_LIST = $(patsubst %.c,%.o,$(SRC_C_LIST) )
SRC_D_LIST = $(patsubst %.o,%.d,$(OBJ_LIST))
.PHONY:all
all: $(SRC_O)
ar rvs foobar.a $(OBJ_LIST)
$(SRC_O): %.o : %.c
arm-none-eabi-gcc -c $< -I inc/ -o $@ -MM -MT $@ -MF $(notdir $(patsubst %.o,%.d,$@))
-include $(SRC_D_LIST)
答案 0 :(得分:1)
如果您不介意在相应的.o
文件中包含.d
和.c
文件,请使用隐式规则:
LIB := foobar.a
SRC := fd1/foo.c fd2/bar.c
OBJ := $(SRC:.c=.o)
DEP := $(OBJ:.o=.d)
CC := arm-none-eabi-gcc
ARFLAGS := rvs
CPPFLAGS := -MMD -MP -I inc
.PHONY: all
.PRECIOUS: $(OBJ)
all: $(LIB)
$(LIB): $(LIB)($(OBJ))
-include $(DEP)