Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何更正Makefile,使其生成所有源文件?(回答:检查隐藏的选项卡)_C_Makefile_Clang - Fatal编程技术网

C 如何更正Makefile,使其生成所有源文件?(回答:检查隐藏的选项卡)

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

在使用ClangV7.0.2和MakeV3.81的OSXV10.10.5中,我在当前项目中遇到了一些问题,我认为这是一个直接的Makefile

当我再添加一对.h/.c文件时,问题就出现了——之前,一切似乎都很正常。现在make将不会“拾取”并构建新的源代码,即使我可以成功地手动构建它。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
显然,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
>