我正在学习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
这样的隐式规则,该AFAIK在后台执行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
编辑:所有文件的详细粘贴框https://pastebin.com/FZy5kqzj
最佳答案
首先,请勿使用C++编译器编译C源代码,除非您确定它严格使用这两种语言的通用子集编写。 C和C++各自具有彼此缺乏的功能,并且可以编写符合两种语言但对每种语言具有不同含义的代码。除非您有意识且有足够的心血来编写双语言代码,否则请对C代码使用C编译器。
其次,如果使用make
,则完全使用以下makefile:
产生您要求的输出:
那么最有可能得出的结论是calcular.o
不存在,并且不存在make
知道如何构建它的源文件。特别是,没有calcular.c
。这意味着原始的makefile也将不再起作用。也许您不小心删除了源文件,或者在文件名或生成文件或类似文件中引入了拼写错误。
我认为g++
的错误消息还有一种误导性。如果calcular.o
已经存在并且是最新的,但是其访问控制属性阻止您打开它进行读取,则make
不会尝试对其进行重建,但是g++
可能会发出误导性的诊断,其中“实际上没有此类文件或目录”表示“我无法打开此类文件”。在那种情况下,删除calcular.o
,以便make
需要重建它,可能是最干净的解决方案。
关于c++ - Makefile中的隐式规则中的-c标志出现错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62222399/