【问题标题】:Makefile Error - Linker input file unusedMakefile 错误 - 链接器输入文件未使用
【发布时间】:2015-10-15 00:27:29
【问题描述】:

我正在尝试运行一个如下所示的简单 makefile:

T=-ansi -pedantic -Wall -Werror
a.out: test.o extra.o
    gcc $(T) -c test.o extra.o

test.o: test.c test.h 
    gcc $(T) -c test.c

extra.o: extra.c extra.h 
    gcc $(T) -c extra.c

clean:
    rm *.o a.out

但我似乎收到警告,告诉我“链接器输入文件未使用,因为链接未完成”

我尝试在 gcc 之后从 a.out 指令中删除“-c”,但这会给我带来更多问题。我不知道如何从这里开始,任何想法/意见将不胜感激。

编辑:我正在通过“make -T”运行程序,同时从 a.out 中删除 -c,导致错误“无效符号索引”

【问题讨论】:

  • 对不起,我像“make -T”一样运行它,如果我删除 -c,我会遇到“无效符号索引”的问题
  • 查看答案...但是make -T 很奇怪;那有什么用? “无效符号索引”建议您删除所有 .o 文件并重新从头运行。
  • My Assigment 指定使用通过 T 命令构建的 makefile(makefile 中的第一行)。
  • make -T 不这样做......不管它做什么。 T宏很好;它的用法很好。从命令行删除-T。 (我注意到 GNU make 3.81 不承认 -T 是一个有效的选项。要么它是新的,要么你使用的是 make 的不同变体。)

标签: c++ c makefile


【解决方案1】:

您需要从a.out 命令中删除-c

a.out: test.o extra.o
    gcc $(T) test.o extra.o

或者,更好:

a.out: test.o extra.o
    gcc $(T) -o $@ test.o extra.o

或者,更好:

extra: test.o extra.o
    gcc $(T) -o $@ test.o extra.o

错误消息通常是因为您在命令行中使用-c 指定了类似-lm 的内容,但您在这里没有这样做。 OTOH,您正在使用 -c 选项列出目标文件 - 这将生成警告:

gcc -ansi -pedantic -Wall -Werror -c test.o extra.o
                                   ^ this one, here

那些.o 文件是链接器输入,但您没有链接。删除-c,您将生成a.out。这应该可以继续。

我想这是我第一次看到用于构建a.out 的makefile。这在极端情况下是不寻常的——不是完全错误,但绝对不是你通常使用make 的方式。它具有从单个源文件构建程序的内置规则,例如来自example.cexample。通常,您会根据其中一个源文件为程序指定一个有意义的名称。请注意,创建程序test 通常是个坏主意;典型的 shell 中内置了一个标准的test 命令,并且混乱很猖獗。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多