2010-11-09 65 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 ...