在gcc中使用此makefile进行编译时收到错误
cannot specify -o with -c, -S or -E with multiple files"
现在我猜这与尝试两次编译同一个文件有关,但我不知道如何。
assembler : main.o assembler.o utils.o
gcc -g -ansi -Wall -pedantic -lm main.o assembler.o utils.o -o assembler
main.o : main.c assembler.h utils.h
gcc -c -ansi -Wall -pedantic -lm main.c assembler.h utils.h -o main.o
assembler.o : assembler.c
gcc -c -ansi -Wall -pedantic -lm assembler.c -o assembler.o
utils.o : utils.c structs.h
gcc -c -ansi -Wall -pedantic -lm utils.c structs.h -o utils.o
文件包含如下:
structs.h is included in utils.c,
utils.c is included in utils.h,
utils.h is included in assembler.c,
assembler.c is included in assembler.h,
assembler.h is included in main.c.
(:不知道为什么,它让我在代码编写中做到了......
答案 0 :(得分:0)
您的makefile错误地将所有依赖项添加到编译命令,而不仅仅是第一个。结果是您尝试将头文件编译为翻译单元,这是不合适的。
在 link 命令中添加所有依赖项是正确的,该命令将多个目标文件组合成一个可执行文件。但是,正如错误消息所示,在使用-c
选项创建目标文件时,提供多个源文件将无法正常工作。
因此编译配方通常使用$<
(第一依赖项),而链接配方将使用$^
(所有依赖项)。请参阅制作手册的automatic variables chapter。
答案 1 :(得分:0)
你可能需要这个makefile(只需从gcc命令中删除.h文件):
assembler : main.o assembler.o utils.o
gcc -g -ansi -Wall -pedantic -lm main.o assembler.o utils.o -o assembler
main.o : main.c assembler.h utils.h
gcc -c -ansi -Wall -pedantic main.c -o main.o
assembler.o : assembler.c
gcc -c -ansi -Wall -pedantic assembler.c -o assembler.o
utils.o : utils.c structs.h
gcc -c -ansi -Wall -pedantic utils.c -o utils.o
答案 2 :(得分:0)
也许是一种更好的方式:
assembler:: main.o assembler.o utils.o
gcc -o $@ main.o assembler.o utils.o -lm
.c.o:
gcc -c -g -ansi -Wall -pedantic $*.c