我正在学习makefile,我想通过使用隐式规则来减少我的makefile。到目前为止,我所拥有的就是这样的文件。
CC = /usr/bin/g++
OBJECTS_INTERACTIVE = calcular.o calc_interactive.o
calc_interactive: $(OBJECTS_INTERACTIVE)
$(CC) $(OBJECTS_INTERACTIVE) -o $@
calcular.o: calcular.c calcular.h
$(CC) -c calcular.c
calc_interactive.o: calcular.h calc_interactive.c
$(CC) -c calc_interactive.c
如果我这样运行,就不会出错。然而,我想使用一个隐式规则,如 calcular.o: calcular.h
,该公司正在进行 g++ -c calcular.c
引擎盖下。但显然 它在执行该命令时,没有 -c
标志,我认为这是关键,我没有设法让g++使用 -c
标志,当使用隐式规则时。这就是我想实现的目标。
CC = /usr/bin/g++
OBJECTS_INTERACTIVE = calcular.o calc_interactive.o
calc_interactive: $(OBJECTS_INTERACTIVE)
$(CC) $(OBJECTS_INTERACTIVE) -o $@
calcular.o: calcular.h
calc_interactive.o: calcular.h
它产生了这个错误。
jules@desktop:$ make
/usr/bin/g++ -c calc_interactive.c
/usr/bin/g++ calcular.o calc_interactive.o -o calc_interactive
g++: error: calcular.o: No such file or directory
makefile:11: recipe for target 'calc_interactive' failed
make: *** [calc_interactive] Error 1
EDIT:所有文件的详细粘贴栏https:/pastebin.comFZy5kqzj
首先,不要用C++编译器编译C源代码,除非你是 肯定的 严格来说,它是用这两种语言的共同子集编写的。 C和C++各自都有另一种语言所缺乏的特性,有可能写出符合这两种语言的代码,但对每一种语言的意义都不同。 除非你有意识地、有根据地去写双语言代码,否则就用C编译器来写C代码。
在第二种情况下,如果 make
,使用的正是这个makefile。
CC = /usr/bin/g++ OBJECTS_INTERACTIVE = calcular.o calc_interactive.o calc_interactive: $(OBJECTS_INTERACTIVE) $(CC) $(OBJECTS_INTERACTIVE) -o $@ calcular.o: calcular.h calc_interactive.o: calcular.h
会产生你所说的输出。
jules@desktop:$ make /usr/bin/g++ -c calc_interactive.c /usr/bin/g++ calcular.o calc_interactive.o -o calc_interactive g++: error: calcular.o: No such file or directory makefile:11: recipe for target 'calc_interactive' failed make: *** [calc_interactive] Error 1
那么最可能的结论是 calcular.o
并不存在,也没有任何源文件可供参考。make
懂得如何打造它。 特别是,没有 calcular.c
. 这意味着原来的makefile应该也不能用了。 也许你不小心删除了源文件,或者在文件名或makefile中引入了一个拼写错误,或者类似的情况。
我想也有可能是 g++
的错误信息具有误导性。 如果 calcular.o
已经存在并且是最新的,但它的访问控制属性阻止你打开它进行阅读,那么 make
不会试图重建它,但 g++
可能 发出一个误导性的诊断,其中 "没有这样的文件或目录 "实际上意味着 "我无法打开这样的文件"。 在这种情况下,删除 calcular.o
所以 make
需要重建它,可能是最干净的解决方案。