我刚刚使用标题组织了我的代码,但正如我已经这样做的那样,我收到了一个警告,在链接时会变成错误。
我在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:在函数'main'中:
test.c:11:警告:隐含声明功能'测试'
ubuntu @ eeepc:〜/ Development / Test $
当时它只是一个简单的警告,但当我尝试链接它时......
ubuntu @ eeepc:〜/ Development / Test $ ld -T linker.ld -o kernel.bin loader.o test.o
中
test.o:在函数main':
Testing'
test.c:(.text+0xfc): undefined reference to
我需要做什么?
答案 0 :(得分:1)
编辑:为了反映OP的问题,尽管受到了投票,但我已经找到了一些答案......
为什么在编译器中标记了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 */
希望这有帮助, 最好的祝福, 汤姆。
答案 1 :(得分:1)
我无法重现你的问题。当我尝试在Ubuntu机器上编译代码时,这会按预期工作(基于您的粘贴,我假设您正在使用它。)
你确定#include正确发生吗?
尝试使用-E而不是-c来查看编译器尝试编译的整个代码是什么样的。
答案 2 :(得分:0)
在这里黑暗中有点射击,因为我的C有点生锈,但是C允许你将函数体放在标题中吗?我不记得它确实如此。尝试将Testing()和print()的定义移动到.c文件中?你也可以尝试编译为C ++,看看是否修复它,如果你不需要/想要C。
答案 3 :(得分:0)
您已将test.h
添加到main.c
,而您的声明则根据您所写的test1.h
。请注意名称中的1
。
除此之外,您正在编译test.c
并关联test.o
,而实际上您的文件名称为test1.c
。再次注意名称中的1
。
修改:现在您编辑了main.c
中包含的文件的名称。在编辑之后,可以安全地断言您描述的大多数症状 不可能 与当前版本的文件。重新验证您正在做什么,发布更新的诊断信息和/或发布实际代码。
但是,编译器和链接器行指的是旧文件名。
答案 4 :(得分:0)
我不知道是什么造成这种情况,但我刚才遇到了这个问题。 尝试删除.h文件,并将函数的声明放在.c文件本身的顶部。
在这种情况下,删除test1.h并将test1.c的函数声明放在test1.c中。 并在test.c中包含test1.c 您不会再收到该警告消息,也不会出现以下链接错误。