带有子文件夹的 Makefile 中出现错误

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

我有一个包含很多子文件夹的项目:

我正在尝试编写一个 Makefile,它可以将所有内容编译成一个 .exe。
这是我的 Makefile :

#Makefile


CFLAGS = -Wall -Wextra -O3

SRC = $(wildcard */*.c)

OBJ = $(SRC:.c=.o)

all : Executable

Executable : $(OBJ)
    gcc -o Executable  $(OBJ)

#transforme tous les .c en .o
%.o : %.c
    gcc -o $(OBJ) -c $(SRC)

clean:
    rm Executable
    find . -type f -name "*.o" -exec rm {} \;




#END

但是,效果不是很好。 我在清理时遇到错误:

find . -type f -name "*.o" -exec rm {} \;
cc  -o clean  
cc: fatal error: no input files
compilation terminated.
make: *** [Makefile:21: clean] Error 1

还有汇编:

gcc -o construct_grid/construct_grid.o detect_boxes/detect_boxes.o detect_character/detect_character.o errors/errors.o fileManager/fileManager.o preprocessing/preprocessing.o solver/solver.o -c construct_grid/construct_grid.c detect_boxes/detect_boxes.c detect_character/detect_character.c errors/errors.c fileManager/fileManager.c preprocessing/preprocessing.c solver/solver.c
gcc: fatal error: cannot specify ‘-o’ with ‘-c’, ‘-S’ or ‘-E’ with multiple files
compilation terminated.
make: *** [Makefile:17: construct_grid/construct_grid.o] Error 1

我的 Makefile 有什么问题,我该如何修复它?

gcc makefile subdirectory
1个回答
0
投票

我在清理时遇到错误:

find . -type f -name "*.o" -exec rm {} \;
cc  -o clean  
cc: fatal error: no input files
compilation terminated.
make: *** [Makefile:21: clean] Error 1

所提供的 makefile 中没有任何内容解释为什么

cc -o clean
将在
make clean
期间执行。或者曾经。如果您提供了完整的 makefile,那么我只能假设它没有被直接使用,而是被
include
放入其他负责引入额外命令的 makefile 中。

另一方面,这...

gcc -o construct_grid/construct_grid.o detect_boxes/detect_boxes.o detect_character/detect_character.o errors/errors.o fileManager/fileManager.o preprocessing/preprocessing.o solver/solver.o -c construct_grid/construct_grid.c detect_boxes/detect_boxes.c detect_character/detect_character.c errors/errors.c fileManager/fileManager.c preprocessing/preprocessing.c solver/solver.c
gcc: fatal error: cannot specify ‘-o’ with ‘-c’, ‘-S’ or ‘-E’ with multiple files
compilation terminated.
make: *** [Makefile:17: construct_grid/construct_grid.o] Error 1

...是这个不正确规则的结果:

%.o : %.c
    gcc -o $(OBJ) -c $(SRC)

诸如此类的模式规则应该有一个配方,可以根据相应的先决条件构建与目标模式匹配的one文件。您的

$(OBJ)
扩展为 all 所需目标文件的名称,并且
$(SRC)
扩展为 all 相应源的名称。编译器不接受生成的命令是一个附带问题。此外,该规则不会使用您的
CFLAGS
变量中设置的编译选项。

您似乎想要更多类似这样的东西:

%o: %c
        gcc $(CFLAGS) -c $< -o $@

$@
是一个自动变量,它扩展到正在构建的目标的名称(在本例中是.o文件之一),
$<
是另一个自动变量,它扩展到第一个先决条件的名称在列表中。

或者您甚至可以完全忽略该规则,因为

make
有一个内置规则,可以执行基本相同的操作(但不相同,因为内置规则可以识别您未使用的一些其他变量)。

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