2013-06-23 137 views
0

我已經設置了以下.h文件: h file code with error奇怪未定義的符號錯誤

我不知道爲什麼我得到關於我的C文件中的錯誤。 這裏是我的C文件中的唯一的地方,我用這個函數:

Inc1(int ptr) 
{ 
    set_sist(print_var1); 
    while (1) 
    { 
    count1++; 
    if ((count1 % 20000) == 0) 
     var1++; 
    } // while 

} /* Inc */ 

不用說,我在文件的頭部有一個#include "my1.h"。 錯誤是:

#include <conf.h> 
#include <kernel.h> 
#include <io.h> 
#include <proc.h> // for currpid 
#include "my1.h" // uses 'FPTR' type 


SYSCALL set_sist(FPTR int1) 
{ 
bla bla bla bla 
} 

我使用bat文件用下面的代碼編譯的文件:

在模塊hw4.c

的功能被另一個C文件正在實施未定義符號_set_sist

e: cd xinu4win\newsrc\hw4 path e:\tc\tc\bin;%path% tcc -I.. -c -DTURBOC initiali.c tcc -I.. -c initiali.c > errs tcc -I.. -c kill.c > errs tcc -I.. -c resched.c > errs tcc -I.. -c setsist.c > errs type errs tlib xinu.lib -+ initiali.obj -+ kill.obj -+ resched.obj -+setsist.obj tlib xinu.lib -+ setsist.obj tcc -I.. hw4.c my1.h ..\xinu.lib hw4 pause 

有什麼想法嗎?

+2

你可以發佈構建日誌嗎?我幾乎無法從該圖像中讀取它。 –

+3

將包含'set_sist()'函數**定義**的目標文件與其他文件鏈接起來。包括頭文件是不夠的。 – 2013-06-23 17:13:51

+2

停止發佈圖片,因爲它們很難讀取。 – harper

回答

0

鏈接器會搜索您的代碼和所有庫以供參考。也許你沒有包含一個需要的庫或其他目標模塊?

+0

我提出了完成命令..你能找到它的錯嗎? –

0

似乎有一個下劃線的區別。這是你的編譯器追加到其處理中所有符號的前面,還是你使用set_sist_set_sist作爲函數?

我看到你在哪裏使用它,在Inc1,你聲稱它存在extern int set_sist(int),但你在哪裏定義它?如果你沒有定義它,它會很好地編譯,因爲你的extern語句承諾函數存在於其他地方,但是當鏈接器真的需要定義時它不會鏈接。

+0

我不使用_set_sist。該函數在其標籤所在的另一個文件中實現:SYSCALL set_sist(FPTR int1) –

+0

需要編譯其他文件,然後與此文件鏈接。它看起來像你把它鏈接到xinu.lib。我不知道你的編譯器的語法,但是我不確定你是否真的在xinu.lib中鏈接,當你在命令行上列出它時。嘗試在庫文件前使用-l指定預編譯的庫。 – John

+0

Xinu是一個給定的系統。我的任務是改變它。所以我想再添加2個C文件和1個頭文件到Xinu庫中......我懷疑編譯命令的順序有問題..它總是在以前工作。 –