为何Makefile未生成printHeader.o文件?技术求助
问题分析与解决
你的Makefile存在一个明确的错误:mkprog目标的依赖列表里未包含printHeader.o,但链接命令中却引用了这个文件。Make的工作逻辑是仅根据目标的依赖项来触发对应文件的构建,由于依赖里没写printHeader.o,Make完全不会执行它的编译规则,自然也就不会生成这个目标文件。
修改后的Makefile
all: mkprog mkprog: main.o printlist.o insertNode.o printLine.o printHeader.o readfile.o totalCatGrade.o option1.o gcc main.o printlist.o insertNode.o printLine.o printHeader.o readfile.o totalCatGrade.o option1.o -o mkprog main.o:main.c lab4.h gcc -ansi -pedantic -c main.c -o main.o printlist.o:printlist.c lab4.h gcc -ansi -pedantic -c printlist.c -o printlist.o insertNode.o:insertNode.c lab4.h gcc -ansi -pedantic -c insertNode.c -o insertNode.o printLine.o:printLine.c lab4.h gcc -ansi -pedantic -c printLine.c -o printLine.o printHeader.o:printHeader.c lab4.h gcc -ansi -pedantic -c printHeader.c -o printHeader.o readfile.o:readfile.c lab4.h gcc -ansi -pedantic -c readfile.c -o readfile.o totalCatGrade.o:totalCatGrade.c lab4.h gcc -ansi -pedantic -c totalCatGrade.c -o totalCatGrade.o option1.o:option1.c lab4.h gcc -ansi -pedantic -c option1.c -o option1.o clean: rm -rf *.o mkprog
关键修改说明
给mkprog目标的依赖项补上printHeader.o后,Make在构建mkprog时会先检查所有依赖的.o文件是否存在,若不存在则自动调用对应的编译规则生成,之后再执行链接命令。
另外,你可以利用Make的自动变量和隐含规则简化Makefile,减少重复代码,也能避免依赖与链接文件不匹配的问题:
CC = gcc CFLAGS = -ansi -pedantic all: mkprog mkprog: main.o printlist.o insertNode.o printLine.o printHeader.o readfile.o totalCatGrade.o option1.o $(CC) $^ -o $@ %.o: %.c lab4.h $(CC) $(CFLAGS) -c $< -o $@ clean: rm -rf *.o mkprog
内容的提问来源于stack exchange,提问作者Virgil Jericho
相关产品推荐
相关产品推荐

