【问题标题】:Program_name: linker input file unused because linking not doneProgram_name:链接器输入文件未使用,因为链接未完成
【发布时间】:2016-01-30 15:58:30
【问题描述】:

我有 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: 链接器输入文件未使用,因为链接未完成"

【问题讨论】:

    标签: c makefile


    【解决方案1】:

    举一个例子:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多