-1

我刚刚使用标题组织了我的代码,但正如我所做的那样,我收到了一个警告,在链接时变成了错误。

我有一个代码(使用标题内的函数)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:~/Development/Test$ gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
test.c:在函数'main'中:
test.c:11:警告:隐式函数“测试”的声明<br> ubuntu@eeepc:~/Development/Test$

当时这只是一个简单的警告,但是当我尝试链接它时......

ubuntu@eeepc:~/Development/Test$ ld -T linker.ld -o kernel.bin loader.o test.o
test.o: In function Testing'main':
test.c:(.text+0xfc): undefined reference to

我需要做什么?

4

5 回答 5

1

编辑:为了反映 OP 的问题,尽管被赞成,我还是删除了我的一些回答...

为什么 kernel.c 在编译器中被标记,即使你没有在这里提到它?我是不是错过了什么...

gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
kernel.c:在函数'main'中:
kernel.c:11:警告:函数“测试”的隐式声明
ubuntu@eeepc:~/开发/测试$

也许你需要在头文件的某个地方这样做,因为我判断你希望内核访问这个函数:

外部无效测试();

并且,取出所有函数并将它们放在一个单独的 .c 文件中,它们首先不应该在那里......例如:

测试.c
/* 这里的所有函数 */

测试.h
/* 只有全局、外部变量和函数原型 */

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-27T02:04:31.840 回答
1

我无法重现您的问题。当我尝试在 Ubuntu 机器上编译您的代码时,这可以按预期工作(根据您的粘贴,我假设您正在使用。)

您确定#include 正确发生吗?

尝试使用 -E 而不是 -c 来查看编译器试图编译的整个代码是什么样的。

于 2010-01-27T02:13:32.273 回答
0

在这里有点摸不着头脑,因为我的 C 有点生锈,但是 C 是否允许您将函数体放在标题中?我不记得确实如此。尝试将 Testing() 和 print() 的定义移动到 .c 文件中?如果您不需要/想要 C,您也可以尝试编译为 C++,看看是否可以修复它。

于 2010-01-27T02:04:06.053 回答
0

您包含test.hmain.c中,而根据您所写的,您的声明在test1.h. 请注意1名称中的 。

除此之外,您正在编译test.c和链接test.o,而实际上您的文件名是test1.c. 再次,注意1名称中的 。

编辑:现在您编辑了包含在main.c. 编辑后,可以安全地断言您描述的大多数症状不适用于当前版本的文件。重新验证您在做什么,发布更新的诊断信息和/或发布真实代码。

尽管如此,您的编译器和链接器行仍然指的是旧文件名。

于 2010-01-27T02:12:47.433 回答
0

我不知道是什么原因造成的,但我刚才遇到了这个问题。尝试删除 .h 文件并将函数声明放在 .c 文件本身的顶部。

在这种情况下,删除test1.h并将test1.c的函数声明放在test1.c中。并在 test.c 中包含 test1.c,您将不会再收到该警告消息,也不会出现以下链接错误。

于 2010-05-26T14:21:09.423 回答