Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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将obj文件放在单独的目录中?_C_Makefile - Fatal编程技术网

C 如何让Makefile将obj文件放在单独的目录中?

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

如果我的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_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
/
),这样您就可以找到答案