我希望我的make文件输出(目标文件.o)到另一个子目录,例如OBJECTS_DIR =“ ./ build”

我也希望将我的.exe放在DIST_DIR =“ ./ dist”中

我的下面的make文件可以正常工作(编译和链接),但是路径相同。

# vars
CXX = g++
CXXFLAGS = -c89 -Wall -g
CC = gcc
CFLAGS = -Wall -g
SOURCES_C = main.c A.c B.c C.c D.c E.c
INCLUDES=
OBJECTS_DIR=./build
DIST_DIR=./dist
PROGRAM = main

OBJECTS = $(SOURCES_C:.c=.o)

debug := CFLAGS

all debug: $(PROGRAM)

$(PROGRAM): $(INCLUDES) $(OBJECTS)
        $(LINK.c) -o $@ $(OBJECTS)


clean:
        rm -f $(PROGRAM) $(OBJECTS)


我如何实现将.o文件输出到OBJECTS_DIR,然后从OBJECTS_DIR链接并将.exe输出到DIST_DIR。

根据用户建议进行了更新:

# vars
CXX = g++
CXXFLAGS = -Wall -g
CC = gcc
CFLAGS = -std=c89 -Wall -g
SOURCES_C = main.c A.c B.c C.c D.c E.c
OBJECTS_DIR := build
OBJECTS := $(SOURCES_C:%.c=$(OBJECTS_DIR)/%.o)
INCLUDES :=
DIST_DIR := dist
PROGRAM  := $(DIST_DIR)/main
OBJECTS = $(SOURCES_C:.c=.o)

debug := CFLAGS

all debug: $(PROGRAM)

$(PROGRAM): $(INCLUDES) $(OBJECTS)
    $(CC) -o $@ $(OBJECTS)


clean:
    rm -f $(PROGRAM)
    rm -f $(OBJECTS)


我按预期更新了Make及其工作。我一直依靠IDE来生成我的Makefile。

1)我有没有意识到的问题?

2).PHONY的意义是什么(仍然没有得到)。

谢谢

最佳答案

以下makefile尚未经过测试

请注意,使用':='来定义宏,因此该宏只需要评估一次

注意:“。PHONY:”语句是要告诉make不会生成具有关联名称(干净,全部)的文件

根据Chris Dodd编辑的评论

CC           :=  /usr/bin/gcc
RM           :=  /bin/rm
CFLAGS       := -Wall -g -Wextra -Wconversion -pedantic -std=gnu11
SOURCES_C    := main.c A.c B.c C.c D.c E.c
OBJECTS_DIR  := build
DIST_DIR     := dist
PROGRAM      := $(DIST_DIR)/main
OBJECTS      := $(SOURCES_C:.c=$(OBJECTS_DIR)/%.o)

.PHONY: all
all: $(PROGRAM)

$(PROGRAM):  $(OBJECTS)
        $(CC) -o $@ $(OBJECTS)

$(OBJECT_DIR)/%.o:%.c
        $(CC) $(CFLAGS) -c %$<  -o $@

.PHONY: clean
clean:
        rm -f $(PROGRAM)
        rm -f $(OBJECTS)

10-06 00:56