Linux上带有多个*.c文件的GCC makefile
我需要为这些文件创建一个MakeFile:Linux上带有多个*.c文件的GCC makefile,c,gcc,makefile,C,Gcc,Makefile,我需要为这些文件创建一个MakeFile: main.c 凯瑟c 凯瑟 我试过这个: all: task1 task1 : main.o ceaser.o gcc main.o ceaser.o task1.o -o task1 ceaser.o : ceaser.c ceaser.h gcc -c -g -Wall ceaser.c main.o : main.c gcc -c -g -Wall main.c clean: rm *.o cleanall: rm task1 *.o 但当
all: task1
task1 : main.o ceaser.o gcc main.o ceaser.o task1.o -o task1
ceaser.o : ceaser.c ceaser.h gcc -c -g -Wall ceaser.c
main.o : main.c gcc -c -g -Wall main.c
clean: rm *.o
cleanall: rm task1 *.o
但当我试图运行它时,它只是说:
make: Nothing to be done for `MakeFile1'.
要使其成为一个合适的makefile,格式设置至关重要,否则根本无法工作
all: task1
task1 : main.o ceaser.o
gcc main.o ceaser.o -o task1
ceaser.o : ceaser.c ceaser.h
gcc -c -g -Wall ceaser.c -o $@
main.o : main.c
gcc -c -g -Wall main.c -o $@
clean:
rm *.o
cleanall:
rm task1 *.o
还要注意的是,这些字符必须是制表符,而不是每个动作行前面的空格。要添加到Edward的答案中,请使用简化版本
all: task1
task1 : main.o ceaser.o
gcc $^ -o $@
%.o : %.c
gcc -c -g -Wall $< -o $@
clean:
rm *.o
cleanall:
rm task1 *.o
all:task1
任务1:main.o ceaser.o
gcc$^-o$@
%.o:%.c
gcc-c-g-Wall$<-o$@
清洁:
rm*.o
清洁所有:
rm task1*.o
其中“$?”是依赖项列表,“$@”是目标输出,“$注意,makefile仅在需要时才执行命令(源的时间戳比输出文件新).删除所有的*.o文件和task1文件并检查其是否有效。您的缩进也不好,但我想这只是堆栈溢出格式的问题,您似乎丢失了(至少)代码段中的多个换行。所有其他文件都已删除,但仍会删除that@OliverCharlesworth:谢谢--已修复。这是一个很好的答案,但您确实希望在该上下文中使用
$^
而不是$?
。区别在于$^
包括所有先决条件,而$?
仅包括新的先决条件r大于目标。对于链接阶段,我们始终希望包含所有.o
文件。$?包括自上次调用make以来已更改的目标。因此,它并不总是尝试构建可用但未更改的目标。对于$^,无论时间戳如何,都会生成所有目标。问题是如果更新main.c
但不更新ceaser.c
链接步骤将是gcc main.o-o task1
,这是错误的,因为它没有包含ceaser.o
@Edward感谢您提供的信息。更新的答案