我有6个程序:HOSpital.c,GenPazienti.c,Triage.c,Paziente.c,Prestazione.c和Reparto.c。
他们中没有人包括任何其他人。
我该怎么做makefile?
我尝试过:
all: HOSpital GenPazienti Paziente Prestazione Reparto Triage
HOSpital: HOSpital.o
gcc -o HOSpital HOSpital.c
HOSpital.o: HOSpital.c
gcc -c HOSpital HOSpital.c
GenPazienti: GenPazienti.o
gcc -o GenPazienti GenPazienti.c
GenPazienti.o: GenPazienti.c
gcc -c GenPazienti GenPazienti.c
Paziente: Paziente.o
gcc -o Paziente Paziente.c
Paziente.o: Paziente.c
gcc -c Paziente Paziente.c
Prestazione: Prestazione.o
gcc -o Prestazione Pretazione.c
Prestazione.o: Prestazione.c
gcc -c Prestazione Prestazione.c
Reparto: Reparto.o
gcc -o Reparto Reparto.c
Reparto.o: Reparto.c
gcc -c Reparto Reparto.c
Triage: Triage.o
gcc -o Triage Triage.c
Triage.o: Triage.c
gcc -c Triage Triage.c
clean:
rm -f *.o
但是,如果我改变了一些东西并输入“make”,我会得到错误: “Program_name:链接器输入文件未使用,因为链接未完成”
答案 0 :(得分:0)
让我们举一个例子:
gcc -c HOSpital HOSpital.c
这将尝试将HOSpital
用作输入文件。
使用正确的选项命名输出文件,-o
,和正确命名。喜欢
gcc -c -o HOSpital.o HOSpital.c
或者根本不指定输出文件名,编译器将使用输入源文件并将.c
后缀更改为.o
。喜欢
gcc -c HOSpital.c
这是同样的问题。
最后并不重要,使用规则以便构建目标文件,但实际上不使用目标文件:
gcc -o HOSpital HOSpital.c
在这里,您可以直接使用源文件来创建程序。我认为你打算使用
gcc -o HOSpital.o HOSpital.o
和上一个问题一样,你犯了这个错误。
最后一些一般提示。
首先,在启用更多警告的情况下构建。从长远来看,它将帮助您找到代码中的错误,并帮助找出可能存在未定义行为的地方。我建议至少添加-Wall -Wextra -pedantic
。
然后您不需要在makefile中明确列出所有目标文件及其规则。 make
程序已经知道如何制作例如目标文件通过implicit rules。
最后一点意味着您可以将makefile缩短为类似
的内容CFLAGS = -Wall -Wextra -pedantic -pipe
LD = gcc
LDFLAGS = -pipe
HOSpital: HOSpital.o
$(LD) $(LDFLAGS) -o $@ $^
GenPazienti: GenPazienti.o
$(LD) $(LDFLAGS) -o $@ $^
Paziente: Paziente.o
$(LD) $(LDFLAGS) -o $@ $^
Prestazione: Prestazione.o
$(LD) $(LDFLAGS) -o $@ $^
Reparto: Reparto.o
$(LD) $(LDFLAGS) -o $@ $^
Triage: Triage.o
$(LD) $(LDFLAGS) -o $@ $^
clean:
-rm -f *.o
变量$@
是规则的目标,变量$^
是所有先决条件。例如,
HOSpital: HOSpital.o
变量$@
为HOSpital
,$^
为HOSpital.o
。