我正在尝试为大学项目制作一个简单计算器的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)/*~
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我的教授没有给我们带头或指示,所以我真的迷失了.
我的项目是在三个文件夹分为:lib,src和include.src包含项目的源,名为calc.c,include包含名为的头calc.h,并lib包含名为的库libcalc.c.
编辑:我想出了这个错误,而且是没有创建obj下面的目录src.但是,它仍然无法正常工作.新的错误消息是:
make: *** No rule to make target `obj/libcalc.o', needed by `calc'. Stop.
Run Code Online (Sandbox Code Playgroud)
编辑2:我刚刚将libcalc.c从lib移动到obj,它工作正常.不理想,但它做我需要的.
该obj目录不存在,因此gcc无法在那里写入输出文件.
您可以从Makefile自动创建它,但根据您想要做的事情,mkdir obj您可能只需要一个简单的东西.
但是,看起来您正在从src目录运行Makefile .您可能希望从项目的根目录运行它并指定src/需要的位置.你想为它添加一个SDIR变量(或类似的); 确保去除../上LDIR,IDIR并且ODIR在这种情况下.
例如,您当前使用的位置%.c,请$(SDIR)/%.c改为使用,并适当移动Makefile.