在Makefile的隐式规则中使用-c标志出错。

问题描述 投票:1回答:1

我正在学习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 makefile
1个回答
0
投票

首先,不要用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 需要重建它,可能是最干净的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.