2012-03-20 57 views
1

我有以下代碼:ç未定義參考

的main.c

#include "checksum.h" 

void main() 
{ 
    char *Buf ="GPGGA204502.005106.9813N11402.2921W1090.91065.02M-16.27M"; 
    checksum(Buf); 
} 

checksum.c

#include <stdio.h> 
#include <string.h> 

checksum(char *Buff) 
{ 
    int i; 
    unsigned char XOR; 
    unsigned long iLen = strlen(Buff); 
    printf("Calculating checksum...\n"); 
    for (XOR = 0, i = 0; i < iLen; i++) 
     XOR ^= (unsigned char)Buff[i]; 
    printf("%X \n",XOR); 
} 

checksum.h

#ifndef CHECKSUM_H_INCLUDED 
#define CHECKSUM_H_INCLUDED 

void checksum(char *Buff); 

#endif 

編譯時,我得到出現以下錯誤:

/tmp/ccFQS7Ih.o: In function `main': 
main.c:(.text+0x18): undefined reference to `checksum' 
collect2: ld returned 1 exit status 

我找不出什麼問題了?

+2

你能後的編譯器命令這兩個文件鏈接在一起?構建'main'時需要鏈接'checksum.o'。 – hmjd 2012-03-20 10:34:49

+0

編譯時也會收到警告(如果不是,編譯器設置不好)。你的函數聲明(這是.h文件中的)和它的定義(即.c中的內容)不匹配。通過在校驗和之前不寫入'void',函數被重新聲明爲返回int的函數。 – 2012-03-20 12:09:25

回答

3

只編譯一個文件不是兩個。更確切地說,你並沒有將文件鏈接在一起。

我不知道你的編譯器,但用gcc,這將是這樣的:

gcc -c main.c   <-- compile only 
gcc -c checksum.c  <-- compile only 
gcc main.o checksum.o <-- link the two 

編輯:自動執行此過程,看看在make程序讀取Makefile小號。

+0

嗯,那個伎倆!有沒有辦法使用gcc時自動執行此操作?我不是AVR的,但我在linux終端上測試一些代碼... – StianL 2012-03-20 10:48:32

+0

寫一個Makefile – nos 2012-03-20 11:44:29

+0

你也可以做'gcc main.c checksum.c' – asaelr 2012-03-20 11:55:57

1

我認爲:在checksum.c中,你應該包含checksum.h。

+0

-1。這是一個鏈接器錯誤,它不會在編譯階段發生,而是在鏈接期間發生。 – 2012-03-20 10:50:41

2

您也可以嘗試 gcc -o program.out main.c checksum.c這將彙編和