Makefile致命错误:无法创建obj / calc.o

时间:2015-06-05 02:09:16

标签: c makefile

我正在尝试为大学项目制作一个简单计算器的makefile。我需要它完成,我已经在网上搜索了教程,我最终找到了这段代码:

IDIR =include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR=lib
SDIR=src

LIBS=-lm

_DEPS = calc.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = calc.o libcalc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


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

calc: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

make命令的输出是

gcc -c -o obj/calc.o calc.c -I../include
Assembler messages:
Fatal error: can't create obj/calc.o: No such file or directory
make: *** [obj/calc.o] Error 1

我的教授没有给我们带头或指示,所以我真的输了。

我的项目分为三个文件夹:libsrcincludesrc包含项目的来源,名为calc.cinclude包含名为calc.h的标头,lib包含名为libcalc.c的库。

编辑:我发现了这个错误,并且obj下的src目录没有创建。但是,它仍然无法正常工作。新的错误消息是:

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

编辑2:我刚将libcalc.c从lib移动到obj,它运行正常。不理想,但它做我需要的。

3 个答案:

答案 0 :(得分:7)

obj目录不存在,因此gcc无法在那里写输出文件。

您可以从Makefile自动创建它,但根据您的目的,您可能只需要一个简单的mkdir obj

但是,看起来您正在从src目录运行Makefile。您可能希望从项目的根目录运行它,并在需要时指定src/。您想为此添加SDIR变量(或类似);在这种情况下,请务必删除../LDIRIDIR上的ODIR

例如,您当前使用%.c的地方,请改用$(SDIR)/%.c,并适当移动您的Makefile。

答案 1 :(得分:0)

根据你的cli命令,你在src/下运行你的makefile,这很好,但是gcc不会为你创建丢失的文件夹。这是代码在我的linux中运行:

$ tree
.
└── test2.c

0 directories, 1 file

$ gcc -c -o obj/test2.o test2.c
Assembler messages:
Fatal error: can't create obj/test2.o: No such file or directory

$ mkdir obj

$ gcc -c -o obj/test2.o test2.c

$ tree
.
├── obj
│   └── test2.o
└── test2.c

1 directory, 2 files

答案 2 :(得分:0)

在src / obj中触摸main.o对我有用