我正在学习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/

10-11 15:54