如何修复Makefile错误?

时间:2017-03-13 01:03:34

标签: c makefile linker

我创建了一个Makefile。现在,我收到了这些错误:

  • clang:警告:brians_brain.o:'链接'输入未使用
  • clang:警告:cell.o:'链接'输入未使用
  • clang:警告:cell_grid.o:'链接'输入未使用
  • 架构x86_64的未定义符号: “_List_Delete”,引自:   _main in brians_brain_cellular_automata.o “_List_Read”,引自:   _main in brians_brain_cellular_automata.o ld:找不到架构x86_64的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用) make:*** [brians_brain_cellular_automata]错误1

这是Makefile:

brians_brain_cellular_automata: brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o
    gcc -Wall brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o

brians_brain_cellular_automata.o: brians_brain_cellular_automata.c brians_brain.o cell.o cell_grid.o
    gcc -Wall -c brians_brain_cellular_automata.c brians_brain.o cell.o cell_grid.o

brians_brain.o: brians_brain.c cell_grid.o cell.o list.o
    gcc -Wall -c brians_brain.c cell_grid.o cell.o list.o

cell_grid.o: cell_grid.c cell.o
    gcc -Wall -c cell_grid.c cell.o

cell.o: cell.c
    gcc -Wall -c cell.c

list.o: list.c cell.o
    gcc -Wall -c list.c cell.o

假设正确使用了标签。

最令我困惑的是这个Makefile今天早些时候工作。我在其中一个依赖项中键入了一些代码,然后开始执行此操作。我恢复了这些更改,但我仍然遇到这些错误。我做错了什么?

1 个答案:

答案 0 :(得分:2)

编译目标文件时,只需传入源文件,而不是其他目标文件。在可执行文件中链接时使用对象文件。这是警告的来源。

对于错误,您在链接可执行文件时不包括list.o,也不会将其列为依赖项。因此,您正在为该文件中的函数获取“未定义的引用”错误。

所以你的makefile应该是这样的:

brians_brain_cellular_automata: brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o list.o
    gcc -Wall brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o list.o

brians_brain_cellular_automata.o: brians_brain_cellular_automata.c 
    gcc -Wall -c brians_brain_cellular_automata.c

brians_brain.o: brians_brain.c
    gcc -Wall -c brians_brain.c

cell_grid.o: cell_grid.c
    gcc -Wall -c cell_grid.c

cell.o: cell.c
    gcc -Wall -c cell.c

list.o: list.c
    gcc -Wall -c list.c

由于每个目标文件的构建方式相同,因此您可以使用通配符实际定义规则来编译目标文件:

brians_brain_cellular_automata: brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o list.o
    gcc -Wall brians_brain_cellular_automata.o brians_brain.o cell.o cell_grid.o list.o

%.o: %.c
    gcc -Wall -c $<

使用此规则,brians_brain_cellular_automata目标中引用的每个目标文件都将使用此规则构建。