我有一个包含很多子文件夹的项目:
我正在尝试编写一个 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 有什么问题,我该如何修复它?
我在清理时遇到错误:
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
有一个内置规则,可以执行基本相同的操作(但不相同,因为内置规则可以识别您未使用的一些其他变量)。