我正在尝试为大学项目制作一个简单计算器的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
我的教授没有给我们带头或指示,所以我真的输了。
我的项目分为三个文件夹: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.
编辑2:我刚将libcalc.c从lib移动到obj,它运行正常。不理想,但它做我需要的。
答案 0 :(得分:7)
obj
目录不存在,因此gcc
无法在那里写输出文件。
您可以从Makefile自动创建它,但根据您的目的,您可能只需要一个简单的mkdir obj
。
但是,看起来您正在从src
目录运行Makefile。您可能希望从项目的根目录运行它,并在需要时指定src/
。您想为此添加SDIR
变量(或类似);在这种情况下,请务必删除../
,LDIR
和IDIR
上的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对我有用