2010-11-09 27 views
4

我之前在声明我的数组记录时遇到了一些问题。现在我认为我的Makefile或其他东西有问题。未定义的引用也许makefile是错误的?

Here is my 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' 
+1

突出显示并按0101按钮进行代码格式化:) – 2010-11-09 05:17:41

+0

修复了大部分问题。仍然在使用格式。 – Jeremy 2010-11-09 05:19:18

回答

5

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

要解决构建问题,弄清楚试图做什么是非常有用的,然后逐个单独运行这些命令,以便您可以查看出现问题的位置。 “make -n”会告诉你“make”会运行什么命令,而不会实际执行它们。我希望看到这样的命令:

gcc -o proj1 main.o set.o 

尝试运行,通过手,看到它可以让你。

+0

工作!我如何在Makefile中反映这一点? – Jeremy 2010-11-09 05:48:17

+0

对于初学者来说,解决'EXEC'和'EEXEC'之间的不一致问题。否则,根据你给我们展示的Makefile,该命令正是“make”应该首先完成的事情。如果不是,请使用“make -n”来找出它*所试图做的事情。 – 2010-11-09 05:52:48

+0

>为什么会出现这种情况并不是显而易见的, – Mud 2010-11-09 06:59:28

0

如果这些都是在一行在makefile:

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

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

+0

修正了这个问题。格式化,当我提交的职位。 – Jeremy 2010-11-09 05:21:14

0

请main.c中确保您已set.h
你也宣告EEXEC但使用EXEC ...