如何更正我的Makefile以便构建我的所有源文件? (答案:检查隐藏的标签)

时间:2015-12-23 04:38:13

标签: c makefile clang

在使用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

1 个答案:

答案 0 :(得分:3)

只有在github中查看原始Makefile时,问题才会明显。第37行(# clean评论后面的行)有一个错误的标签。删除该标签,你应该好好去。