题
我刚刚用头组织了我的代码,但正如我已经这样做了,我得到了一个警告链接时变成一个错误。
我有一个代码(使用一个函数,它是一个集管内的)在该test.c
是这样的:
#include "test1.h"
/* Some code */
main()
{
Testing();
}
和我的test1.h
报头是这样的:
void Testing();
void print(int, int, int, const char*);
和在test1.c
void Testing()
{
print(0xF9, 27, 5, "\xC9\\xBB");
}
void print(int colour, int x, int y, const char *string)
{
volatile char *video=(volatile char*)0xB8000 + y*160 + x*2;
while(*string != 0)
{
*video=*string;
string++;
video++;
*video=colour;
video++;
}
}
当我试图编译代码,我得到这样的:
Ubuntu的@ EeePC的:〜/开发/测试$ gcc的-o test.o -c test.c的-Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs结果 test.c的:在函数“主”:结果 test.c以11:警告:隐函数声明“测试”结果 Ubuntu的@ EeePC的:〜/开发/测试$
当时它只是一个简单的警告,但是当我尝试链接吧...
Ubuntu的@ EeePC的:〜/开发/测试$ ld个-T linker.ld -o kernel.bin loader.o test.o结果 test.o:在功能
main':
Testing'
test.c:(.text+0xfc): undefined reference to
我需要做什么?
解决方案
编辑:以反映OP的问题,我已经打了我的答案有些线路虽然是upvoted ...
<击>为什么kernel.c在编译器中标记了,即使你没有在这里提到的?我思念的东西... 行使>
<击>gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs kernel.c: In function ‘main’: kernel.c:11: warning: implicit declaration of function ‘Testing’ ubuntu@eeepc:~/Development/Test$击>
<击> 撞击>
也许你需要做的是在你的头文件中这样的地方,因为我判断你想要内核使用此功能:
extern void Testing();
和,拿出你所有的功能,并将它们放置在一个单独的.c文件,他们不应该在那里摆在首位...例如:
Testing.c /* all your functions here */ Testing.h /* Only global, external variables and function prototypes */
希望这有助于 最好的祝福, 汤姆。
其他提示
我无法重现你的问题。这按预期工作,当我尝试编译一个Ubuntu机器上的代码(根据你的贴,我假设你正在使用。)
您确定的#include正确回事?
尝试使用-E代替-c,看看整个代码编译器试图编译模样。
有些在这里瞎猜,因为我的C是有点生疏,但Ç让你把函数体中的头?我不记得它。尝试测试()和print()的定义移动到一个.c文件?你也可以尝试编译的C ++作为看看是否能解决它,如果你不需要做/想℃。
您包括test.h
到main.c
,而你的声明,根据你写的东西,都在test1.h
。注意在名称中1
。
除此之外,正在编译test.c
和链接test.o
,而实际上你的文件的名称是test1.c
。此外,请注意在名称中1
。
编辑:现在你编辑纳入main.c
文件的名称。编辑后可以安全地断言,大部分你描述的症状的不possble 的与文件的最新版本。重新验证你在做什么,更新后的信息disgnostic和/或交真正的代码。
不过,你编译器和连接线指的是旧的文件名。
我唐诺导致此什么,但我现在只是有这个问题。 尝试删除.h文件,并把职能的声明上.c文件本身的顶部。
在这种情况下,删除该test1.h和放test1.c的函数的声明在test1.c。 并且包括在test.c的test1.c 你不会得到那个警告信息更多,也不以下链接错误。