Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Makefile:分离的源和对象_C_Makefile_Directory Structure - Fatal编程技术网

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