首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复Makefile错误?

如何修复Makefile错误?
EN

Stack Overflow用户
提问于 2017-03-13 01:03:34
回答 1查看 2.8K关注 0票数 0

我创造了一个Makefile。现在,我发现了这些错误:

  • clang:警告: brians_brain.o:'linker‘输入未使用的
  • clang:警告: cell.o:“链接器”输入未使用的
  • clang:警告: cell_grid.o:'linker‘输入未使用的
  • 未定义的体系结构符号x86_64:"_List_Delete",引用于:_main in brians_brain_cellular_automata.o "_List_Read",引用于:_main in brians_brain_cellular_automata.o ld:符号(S)未找到用于架构x86_64 clang: error: linker命令与退出代码1一起失败(使用-v查看调用):* brians_brain_cellular_automata Error 1

下面是Makefile:

代码语言:javascript
复制
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今天早些时候就开始工作了。我在其中一个依赖项中输入了一些代码,它开始这样做。我恢复了这些更改,但仍然会出现这些错误。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 01:22:46

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

至于错误,您在链接可执行文件时没有包含list.o,也没有将其作为依赖项列出。因此,您将得到该文件中函数的“未定义引用”错误。

所以makefile应该是这样的:

代码语言:javascript
复制
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

由于每个对象文件都是以相同的方式构建的,因此实际上可以使用通配符定义一个规则来编译一个对象文件:

代码语言:javascript
复制
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目标中引用的每个对象文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42755148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档