隐含的功能宣言

时间:2010-01-27 01:57:09

标签: c linker compiler-warnings ld

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

我在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':
test.c:(.text+0xfc): undefined reference to
Testing'

我需要做什么?

5 个答案:

答案 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 您不会再收到该警告消息,也不会出现以下链接错误。