未定义的引用也许makefile是错误的?

问题描述 投票:0回答:4

我之前在声明数组记录集时遇到了一些问题。现在我觉得我的 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'  
c makefile
4个回答
9
投票

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

为了解决构建问题,弄清楚 make 正在尝试做什么通常很有用,然后一次单独运行一个命令,这样您就可以看到哪里出了问题。 “make -n”将显示“make”将运行哪些命令,而无需实际执行它们。我希望看到这样的命令:

gcc -o proj1 main.o set.o

尝试手动运行它,看看它会带给你什么结果。


0
投票

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


0
投票

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

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

那么您就有一个宏

EEXEC
,其值为
proj1 CC = gcc CFLAGS = -c -Wall
,并且您没有
CC
CFLAGS
宏。
CC
可能有一个默认值,这就是为什么那么多都有效。


0
投票

如果是的话,这是从上到下相反的顺序还是?

© www.soinside.com 2019 - 2024. All rights reserved.