【问题标题】:Makefile: Error referencing source files in "src" directoryMakefile:在“src”目录中引用源文件时出错
【发布时间】:2023-04-06 04:42:01
【问题描述】:

[编辑]- 答案是我错误地定义了包含目录的路径。令人尴尬的错误。

我正在编写一个 makefile,它从 src 目录中的 .c 文件构建对象,头文件位于包含目录中,并将它们存储在 obj 目录中,然后从这些对象构建和 exe。下面是玩具版。

# Makefile

IDIR = ../include
CC = gcc
CFLAGS = -I$(IDIR) -Wall

SDIR = src
ODIR = obj

_SOURCES = main.c aux1.c aux2.c aux3.c
SOURCES = $(patsubst %,$(SDIR)/%,$(_SOURCES))

_OBJECTS = $(_SOURCES:.c=.o)
OBJECTS = $(patsubst %,$(ODIR)/%,$(_OBJECTS))

_DEPS = aux1.h aux2.h aux3.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

EXE = exefile

$(ODIR)/%.o: $(SDIR)/%.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

$(EXE): $(OBJECTS)
        $(CC) -o $@ $^ $(CFLAGS) 

.PHONY: clean

clean:
        rm *o $(EXE)

makefile 所在的目录如下所示(当你 ls 时)

include  Makefile  obj  src  trash

当我输入 make 时,我收到以下错误

make: *** No rule to make target `obj/main.o', needed by `exefile'.  Stop.

我怀疑问题出在这一行

$(ODIR)/%.o: $(SDIR)/%.c $(DEPS)

我试图通过在 src/ 中引用相应的源文件来构建 obj/ 中的每个目标文件,但该行似乎对其他东西有用。是这样吗?有没有一种简单的方法可以在不“进入”目录的情况下引用源目录中的 .c 文件?

提前致谢

【问题讨论】:

  • make -d 在尝试构建该文件时会说什么?您确定所有列出的源文件和头文件都在正确的目录中吗?

标签: makefile directory


【解决方案1】:

我相信你的问题是 $(DEPS) 依赖。

您将 IDIR 设置为 ../include,但从顶层目录(运行 make 的地方)该路径不正确。

【讨论】:

  • 嗨,谢谢。我什至没有注意到(我已经相应地编辑了示例)。不幸的是,原来的问题仍然存在。
  • @ThomasKelly 这是什么版本的make?使用您的确切生成文件,在我触摸 src 并包含文件后,我可以运行 make exefile 并且它可以正常工作。
  • 其实你是对的!我没有正确处理包含文件夹(我什至忘了把 .h 文件放在那里)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 2021-12-09
相关资源
最近更新 更多