【问题标题】:How to get Makefile to put obj files in separate directory?如何让 Makefile 将 obj 文件放在单独的目录中?
【发布时间】: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(没有最终的/

标签: c makefile


【解决方案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 文件列表现在是自动的。

【讨论】:

猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2011-05-05
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2012-08-20
  • 1970-01-01
相关资源
最近更新 更多