在使用clang v7.0.2和make v3.81的OS X v10.10.5中,我在当前项目中遇到了一些我认为是直接Makefile的问题。
当我添加一对.h / .c文件时出现了问题 - 之前的一切似乎都运行良好。现在make将不会“接受”#39;并构建新的源代码,即使我可以手动构建它也是成功的。 Make似乎认为.o文件是最新的,即使它看起来甚至不存在。
以下是我的相关项目目录的转储以供参考:
$ ls -R
.:
LICENSE Makefile README.md docs include src
./docs:
ptscheme.ebnf
./include:
lispbool.h lispchar.h lisperr.h lispint.h lisppair.h lispstr.h memmanager.h ptscheme.h
./src:
lispbool.c lispchar.c lisperr.c lispint.c lisppair.c lispstr.c memmanager.c ptscheme.c
以下是我的Makefile的内容:
$ cat Makefile
# Basic Makefile for ptscheme
# Set our paths to traditional locations for files:
# ./src - c source files
# ./include - c header files
vpath %.c src
vpath %.h include
CC = clang
CPPFLAGS = -std=c99 -Wall -g -I include
objects = ptscheme.o memmanager.o lispbool.o lispchar.o lispint.o \
lispstr.o lisperr.o lisppair.o
all: ptscheme
ptscheme: $(objects)
clang $(CPPFLAGS) -o ptscheme $(objects)
ptscheme.o: ptscheme.h memmanager.h
memmanager.o: ptscheme.h memmanager.h
lispbool.o: ptscheme.h memmanager.h lispbool.h
lispchar.o: ptscheme.h memmanager.h lispchar.h
lispint.o: ptscheme.h memmanager.h lispint.h
lispstr.o: ptscheme.h memmanager.h lispstr.h
lisperr.o: ptscheme.h memmanager.h lisperr.h
lisppair.o: ptscheme.h memmanager.h lisppair.h
# clean - Implement standard 'clean' target to clean up after ourselves
.PHONY: clean
clean:
rm -f ptscheme $(objects)
以下是我尝试运行make时会发生的事情:
$ make
clang -std=c99 -Wall -g -I include -c -o ptscheme.o src/ptscheme.c
clang -std=c99 -Wall -g -I include -c -o memmanager.o src/memmanager.c
clang -std=c99 -Wall -g -I include -c -o lispbool.o src/lispbool.c
clang -std=c99 -Wall -g -I include -c -o lispchar.o src/lispchar.c
clang -std=c99 -Wall -g -I include -c -o lispint.o src/lispint.c
clang -std=c99 -Wall -g -I include -c -o lispstr.o src/lispstr.c
clang -std=c99 -Wall -g -I include -c -o lisperr.o src/lisperr.c
clang ptscheme.o memmanager.o lispbool.o lispchar.o lispint.o lispstr.o lisperr.o lisppair.o -o ptscheme
clang: error: no such file or directory: 'lisppair.o'
make: *** [ptscheme] Error 1
显然,即使我的Makefile中有一个与其他模式相同的模式的条目,lisppair.o也没有被构建。
这是验证文件丢失的目录:
$ ls -al *.o
-rw-r--r-- 1 ptdecker 4392 Dec 22 22:00 lispbool.o
-rw-r--r-- 1 ptdecker 3360 Dec 22 22:00 lispchar.o
-rw-r--r-- 1 ptdecker 3376 Dec 22 22:00 lisperr.o
-rw-r--r-- 1 ptdecker 3344 Dec 22 22:00 lispint.o
-rw-r--r-- 1 ptdecker 3776 Dec 22 22:00 lispstr.o
-rw-r--r-- 1 ptdecker 3244 Dec 22 22:00 memmanager.o
-rw-r--r-- 1 ptdecker 15324 Dec 22 22:00 ptscheme.o
当我尝试只运行lisppair.o收据时,make告诉我它认为我想要的目标文件是最新的(!?):
$ make lisppair.o
make: `lisppair.o' is up to date.
我可以手动编译:
$ clang -std=c99 -Wall -g -I include -c -o lisppair.o src/lisppair.c
生成目标文件:
$ ls -al *.o
-rw-r--r-- 1 ptdecker 4392 Dec 22 22:00 lispbool.o
-rw-r--r-- 1 ptdecker 3360 Dec 22 22:00 lispchar.o
-rw-r--r-- 1 ptdecker 3376 Dec 22 22:00 lisperr.o
-rw-r--r-- 1 ptdecker 3344 Dec 22 22:00 lispint.o
-rw-r--r-- 1 ptdecker 5664 Dec 22 22:03 lisppair.o
-rw-r--r-- 1 ptdecker 3776 Dec 22 22:00 lispstr.o
-rw-r--r-- 1 ptdecker 3244 Dec 22 22:00 memmanager.o
-rw-r--r-- 1 ptdecker 15324 Dec 22 22:00 ptscheme.o
让我重新运行make,这样我的最终构建和链接就完成了:
$ make
clang ptscheme.o memmanager.o lispbool.o lispchar.o lispint.o lispstr.o lisperr.o lisppair.o -o ptscheme
让我最终到达我想要的地方:
$ ./ptscheme
>
感谢您的帮助和反馈!显然,我错过了一些基本的东西。
可以找到所有这一切的完整来源in my github repository。
答案 0 :(得分:3)
只有在github中查看原始Makefile
时,问题才会明显。第37行(# clean
评论后面的行)有一个错误的标签。删除该标签,你应该好好去。