C 如何让Makefile将obj文件放在单独的目录中?
如果我的Makefile如下所示:C 如何让Makefile将obj文件放在单独的目录中?,c,makefile,C,Makefile,如果我的Makefile如下所示: .PHONY: clean build all # compilation settings CC = gcc CFLAGS = -I$(INCLUDE_DIR) -Wall -Wextra -Werror -pedantic -std=gnu99 -pedantic -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -g # directory paths INCLUDE_DI
.PHONY: clean build all
# compilation settings
CC = gcc
CFLAGS = -I$(INCLUDE_DIR) -Wall -Wextra -Werror -pedantic -std=gnu99 -pedantic -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -g
# directory paths
INCLUDE_DIR = ./include/
SRC_DIR = ./src/
OBJ_DIR = ./obj/
# file lists
CFILES = $(wildcard ./src/*.c)
OBJS = ./obj/hashtable.o ./obj/infoRetrieval.o ./obj/sort.o ./obj/search.o
# binary
BIN = search
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -o $@ -c $<
$(BIN): $(OBJS)
$(CC) -o $@ $(OBJS)
clean:
rm -f $(OBJS) $(BIN) *~
.
|-- Makefile
|-- README.md
|-- include
| |-- hashtable.h
| |-- infoRetrieval.h
| `-- sort.h
|-- obj
`-- src
|-- hashtable.c
|-- infoRetrieval.c
|-- p5docs
| |-- D1.txt
| |-- D2.txt
| `-- D3.txt
|-- search.c
`-- sort.c
为什么我会收到这个错误消息
make: *** No rule to make target `obj/hashtable.o', needed by `search'. Stop.
我的目标是让我的项目进行编译,使头文件、源文件和目标文件都位于各自的目录中,以便于组织。当$(OBJ_DIR)/%时,解析为:$(SRC_DIR)/%。c
时,它将扩展到
./obj//%.o: ./src//%.c
您有一个额外的/
只需更改您的OBJ_DIR
和SRC_DIR
定义:
SRC_DIR = ./src
OBJ_DIR = ./obj
您还可以通过以下方式简化
Makefile
:
CFILES = $(wildcard $(SRC_DIR)/*.c)
OBJS = $(CFILES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
文件仍然存储在
CFILES
中,但是OBJS
文件列表现在是自动的。打字错误OBJ_DIR
应定义为:OBJ_DIR=/OBJ
(不含final/
),这样您就可以找到答案