我之前在声明我的数组记录时遇到了一些问题。现在我觉得我的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'
答案 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
,并且您没有CC
或CFLAGS
宏。 CC
可能有一个默认值,这就是为什么有这么多的原因。
答案 2 :(得分:0)
确保在main.c中包含了set.h 您也申报EEXEC但使用EXEC ...