C Makefile:分离的源和对象
一段时间以来,我一直试图将项目的源文件与生成的目标文件分开 事实上,我希望我的项目结构如下:C Makefile:分离的源和对象,c,makefile,directory-structure,C,Makefile,Directory Structure,一段时间以来,我一直试图将项目的源文件与生成的目标文件分开 事实上,我希望我的项目结构如下: obj/ main.o src1.o [...] src/ main.c src1.c [...] Makefile 我当前拥有的Makefile如下所示: NAME = a.out OBJ_DIR = "obj" SRC_DIR = "s
obj/
main.o
src1.o
[...]
src/
main.c
src1.c
[...]
Makefile
我当前拥有的Makefile如下所示:
NAME = a.out
OBJ_DIR = "obj"
SRC_DIR = "src"
MAIN_SRC = main.c
PROJ_SRC = src1.c \
src2.c \
src3.c
MAIN_OBJ = $(MAIN_SRC:%.c=%.o)
PROJ_OBJ = $(PROJ_SRC:%.c=%.o)
CC = gcc
RM = rm -rf
$(NAME): $(MAIN_OBJ) $(PROJ_OBJ)
$(CC) $(MAIN_OBJ) $(PROJ_OBJ) -o $(NAME)
all: $(NAME)
clean:
$(RM) $(MAIN_OBJ) $(PROJ_OBJ)
fclean: clean
$(RM) $(NAME)
我试图使用,但没有成功
MAIN_OBJ = $(MAIN_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
PROJ_OBJ = $(PROJ_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
[...]
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
MAIN_OBJ=$(MAIN_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
PROJ_OBJ=$(PROJ_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
[...]
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.c
$(CC)$(CFLAGS)-c$<-o$@
有人能解决我的问题吗?
MAIN\u SRC
和PROJ\u OBJ
没有目录前缀,因此表达式
$(MAIN_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
$(PROJ_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
不要更换任何东西
修正:
然后你的模式规则应该会起作用
您可能希望让make
为您创建$(OBJ_DIR)
:
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR) :
mkdir -p $@
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.c|$(OBJ_DIR)
$(CC)$(CFLAGS)-c-o$@$<
$(OBJ_DIR):
mkdir-p$@
.谢谢您的回复。如果将模式规则中的
$(SRC_DIR)
替换为SRC
,则该解决方案有效。事实上,如果我离开$(SRC_DIR)
,我会得到以下错误:make:**没有规则将目标设置为“obj”/main.o”,这是“a.out”所需要的。停止。
有没有办法用变量代替src
?编辑:我刚刚发现了问题,我删除了变量SRC_DIR
@mrsquare中的引号,删除了“SRC”
和“obj”
中的引号,它们是不必要的。
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR) :
mkdir -p $@