我有一个项目有很多缺点:
的数据
我正在尝试编写一个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有什么问题,我如何修复它?
1条答案
按热度按时间qnzebej01#
我对清洁有错误:
字符串
在makefile中没有任何东西可以解释为什么
cc -o clean
会在make clean
期间被执行。或者曾经。如果你已经展示了完整的makefile,那么我只能假设它没有被直接使用,而是通过将include
d放入其他负责引入额外命令的makefile中。另一方面,这个...
型
.是这个错误规则的后果:
型
像这样的模式规则应该有一个配方,它可以从相应的先决条件中构建与目标模式匹配的 one 文件。您的
$(OBJ)
扩展为 all 所需对象文件的名称,$(SRC)
扩展为 all 相应源文件的名称。编译器不接受结果命令是一个附带问题。此外,该规则不使用CFLAGS
变量中设置的编译选项。你似乎想要更像这样的东西:
型
$@
是一个自动变量,它扩展到正在构建的目标的名称(在本例中是.o文件之一),$<
是另一个自动变量,它扩展到列表中第一个先决条件的名称。或者你甚至可以完全忽略这个规则,因为
make
有一个内置的规则,它做了一个实质上等同的事情(但不完全相同,因为内置的规则识别了一些你没有使用的额外变量)。