如何让 Makefile 将 obj 文件放在单独的目录中?
Posted
技术标签:
【中文标题】如何让 Makefile 将 obj 文件放在单独的目录中?【英文标题】:How to get Makefile to put obj files in separate directory? 【发布时间】:2019-12-04 15:59:33 【问题描述】:如果我的 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
应该定义为:OBJ_DIR = ./obj
(没有最终的/
)
【参考方案1】:
当$(OBJ_DIR)/%.o: $(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
文件列表现在是自动的。
【讨论】:
所以你可以accept回答以上是关于如何让 Makefile 将 obj 文件放在单独的目录中?的主要内容,如果未能解决你的问题,请参考以下文章