【问题标题】:Undefined reference maybe makefile is wrong?未定义的引用可能是 makefile 错误?
【发布时间】:2010-11-09 05:04:51
【问题描述】:

我之前在声明我的数组记录集时遇到了一些问题。现在我觉得我的 Makefile 有什么问题。

这是我的 Makefile:

EEXEC = proj1  
CC = gcc  
CFLAGS = -c -Wall  

$(EXEC) :   main.o set.o 
    $(CC) -o $(EXEC) main.o set.o 

main.o  :   main.h main.c
    $(CC) $(CFLAGS) main.c  

set.o   :   set.h set.c
    $(CC) $(CFLAGS) set.c   

我的 set.c 文件中有更多功能,但这些是我目前正在测试的功能:

DisjointSet *CreateSet(int numElements);  
DisjointSet *MakeSet(DisjointSet *S,int ele, int r);  
void Print(DisjointSet *S);

我在终端收到的错误是:

main.o: In function `main':  
main.c:(.text+0x19): undefined reference to `CreateSet'  
main.c:(.text+0x43): undefined reference to `MakeSet'  
main.c:(.text+0x5f): undefined reference to `Print'  

【问题讨论】:

  • 高亮并按下 0101 按钮进行代码格式化:)
  • 修复了大部分问题。还在习惯这种格式。

标签: c makefile


【解决方案1】:

您遇到的错误是链接器错误,告诉您在链接程序时链接器找不到名为“CreateSet”(等等)的函数。为什么会出现这种情况并不是很明显,因为您似乎在构建命令中包含了“set.o”。

要解决构建问题,通常需要弄清楚 make 试图做什么,然后一次一个地运行命令,这样您就可以看到哪里出了问题。 “make -n”会告诉你“make”会运行哪些命令,而无需实际执行它们。我希望看到这样的命令:

gcc -o proj1 main.o set.o

尝试手动运行它,看看它会把你带到哪里。

【讨论】:

  • 对于初学者来说,修复EXECEEXEC之间的不一致。否则,根据您向我们展示的 Makefile,该命令正是 make 首先应该执行的操作。如果不是,请使用“make -n”找出它正在尝试做什么。
  • > 为什么会这样并不明显,
  • 当我习惯为该作业中的文件使用“make assign”时,我想我必须为所有文件键入“make”。感谢您的帮助!
【解决方案2】:

确保您已在 main.c 中包含 set.h
你也声明 EEXEC 但使用 EXEC...

【讨论】:

    【解决方案3】:

    如果这些都在 makefile 的一行中:

    EEXEC = proj1 CC = gcc CFLAGS = -c -Wall
    

    那么你有一个宏EEXEC,其值为proj1 CC = gcc CFLAGS = -c -Wall,而你没有CCCFLAGS宏。 CC 可能有一个默认值,这就是为什么这么多工作的原因。

    【讨论】:

    • 修复了这个问题。提交帖子时的格式。
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多