2013-06-23 142 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库中......我怀疑编译命令的顺序有问题..它总是在以前工作。 –