C 如何更正Makefile,使其生成所有源文件?(回答:检查隐藏的选项卡)
在使用ClangV7.0.2和MakeV3.81的OSXV10.10.5中,我在当前项目中遇到了一些问题,我认为这是一个直接的Makefile 当我再添加一对.h/.c文件时,问题就出现了——之前,一切似乎都很正常。现在make将不会“拾取”并构建新的源代码,即使我可以成功地手动构建它。Make似乎认为.o文件是最新的,即使它似乎根本不存在 以下是我的相关项目目录的转储,以供参考:C 如何更正Makefile,使其生成所有源文件?(回答:检查隐藏的选项卡),c,makefile,clang,C,Makefile,Clang,在使用ClangV7.0.2和MakeV3.81的OSXV10.10.5中,我在当前项目中遇到了一些问题,我认为这是一个直接的Makefile 当我再添加一对.h/.c文件时,问题就出现了——之前,一切似乎都很正常。现在make将不会“拾取”并构建新的源代码,即使我可以成功地手动构建它。Make似乎认为.o文件是最新的,即使它似乎根本不存在 以下是我的相关项目目录的转储,以供参考: $ ls -R .: LICENSE Makefile README.md docs include s
$ 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
显然,lisppair.o并没有被构建,即使我在Makefile中有一个条目,它遵循与其他文件相同的模式
以下是验证文件丢失的目录:
$ 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
当我试图让make运行lisppair.o收据时,make告诉我它认为我想要的对象文件是最新的(!?):
我可以手动编译它:
$ 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
>
我感谢你的帮助和反馈!显然,我遗漏了一些基本的东西
可以找到所有这些的完整源代码。只有查看github中原始的
Makefile
时,问题才明显。第37行(注释#clean
后的一行)有一个错误选项卡。去掉那个标签,你就可以开始了。哇,这是一个艰难的过程。在删除它之后,你是否尝试过make-n-d lisppair.o
?dawsonc623:有一个隐含的规则。卡鲁姆找到了。我不知道该说什么。多么神奇的事情啊。我觉得自己像个傻瓜。谢谢你抓住了这一点,我能说的就是谢天谢地,我想在github上发布源代码的链接。你是如何在github上看到这一点的?您使用的是源代码查看器还是有突出显示空白差异的工具?首先,根据我的经验,奇怪的生成文件问题通常是由额外或缺少选项卡引起的(使不可见字符变得如此重要的好主意:-),所以我知道我在寻找什么。然后,诀窍就是(用鼠标或Ctrl-a)选择浏览器中的所有文本,这将显示所有空白。我现在在所有代码编辑器中打开可见空白。。我希望每个人都这样做,这样他们就不会留下杂乱的制表符/空格,或者在这个地方留下空白:(
$ ./ptscheme
>