Makefile:分离的源和对象

问题描述 投票:0回答:1

我一直在尝试将项目的源文件与生成的目标文件分开。

确实,我希望我的项目采用这种结构:

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)

我尝试使用pattern rules,但没有成功。

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 $@

有人可以解决我的问题吗?

c makefile directory-structure
1个回答
0
投票

[MAIN_SRCPROJ_OBJ没有目录前缀,因此表达式

$(MAIN_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
$(PROJ_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

请勿更换任何物品。

修复:

MAIN_OBJ := $(MAIN_SRC:%.c=$(OBJ_DIR)/%.o)
PROJ_OBJ := $(PROJ_SRC:%.c=$(OBJ_DIR)/%.o)

然后您的模式规则应该起作用。

© www.soinside.com 2019 - 2024. All rights reserved.