【问题标题】:extern keyword shows undefined refence to my functionextern 关键字显示对我的函数的未定义引用
【发布时间】:2014-04-01 16:22:15
【问题描述】:

我的文件中声明了函数 function1 和 function2

include.h in /dir1/dir2/dir3/dir4/

我已经在

中定义了所有的函数和变量

file include.c at path /dir1/dir2/dir3/dir5/

我在路径中使用这些函数

/dir1/drr2/dir3/dir6/

我的伪代码是...

#include "include.h"
extern int function1();
extern void function(); 
...

function release()
{
  int i = function1();
} 

编译后抛出以下错误:

undefined reference to 'function1'
relocation truncated to fit: R_MIPS_26 against 'function1'  

我知道当我们使用 extern 时,我们必须编译这两个文件,但我目前使用的是 OS161,无法单独编译文件。我必须将所有操作系统文件编译在一起,然后将它们安装到内核中,最后启动它。

错在哪里?

【问题讨论】:

  • 我已经在 include.h 中声明了它们并在 include.c 中实现了它们

标签: c extern os161


【解决方案1】:

如果您将符号声明为extern,则意味着它将不会在此翻译单元中定义。相反,链接器将在链接时搜索该符号,搜索所有目标文件和库,如果找不到,则打印这样的错误消息。

您需要确保在链接过程中,每个使用 extern 函数的对象文件都将与从include.c 生成的对象链接。

除了全局变量之外的函数默认声明为extern,所以这不是这里的问题。

要一起编译多个翻译单元,只需一次将它们全部传递给编译器。

【讨论】:

  • 我已在 include.h 中将函数声明为 extern,无论如何我将所有操作系统文件一起编译
  • 在这种情况下,应该没有问题。你的链接器调用是什么?通常你会做gcc a.c; gcc b.c; gcc a.o b.o,最后一个是链接器调用。
  • 对于 os161 的整个源代码执行命令后不会像火一样使依赖 -- 成功生成 -- 为未定义的错误给出错误
  • 很抱歉,但在这种情况下我无法帮助您。您应该尝试将问题隔离到两个或三个单个文件中,您可以在其中手动调用编译器。您是否尝试过删除extern 是否可以解决问题?
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多