如何让 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_DIRSRC_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 文件放在单独的目录中?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改我的 makefile 以构建到单独的文件夹中

makefile - 单独的文件夹

linux内核模块编译makefile

C ++如何将两个makefile对象目标规则(位于另一个文件夹中)组合到一个目标/规则中?

Makefile-自动依赖

(转)makefile中的自动依赖规则