未定义的引用可能makefile错了?

时间:2010-11-09 05:04:52

标签: c makefile

我之前在声明我的数组记录时遇到了一些问题。现在我觉得我的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'  

3 个答案:

答案 0 :(得分:6)

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

要解决构建问题,找出make尝试做什么通常很有用,然后逐个单独运行命令,这样你就可以看到出错的地方。 “make -n”将显示“make”将运行的命令,而不实际执行它们。我希望能看到如下命令:

gcc -o proj1 main.o set.o

尝试手动运行并查看它的位置。

答案 1 :(得分:0)

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

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

然后您有一个宏EEXEC,其值为proj1 CC = gcc CFLAGS = -c -Wall,并且您没有CCCFLAGS宏。 CC可能有一个默认值,这就是为什么有这么多的原因。

答案 2 :(得分:0)

确保在main.c中包含了set.h 您也申报EEXEC但使用EXEC ...