1

我尝试在我的项目中使用一些全局变量,但不起作用。我这样声明我的变量:

在文件 kernel.h 中:

extern DBConnection * conn;

而且,在我的另一个名为 kernel.c 的文件中,我这样做:

#include "kernel.h"

int get_info() {
    conn = (DBConnection *) malloc(sizeof(DBConnection));
}

但是,在编译时,我收到了一个错误:

/home/fastway/VFirewall-Monitor/kernel.c:19: undefined reference to `conn'

我做错了什么?

4

7 回答 7

3

您提供了声明,但还需要定义。将此添加到您的kernel.c, 在包含之后的顶部:

DBConnection * conn;
于 2013-10-02T20:21:47.620 回答
2

extern DBConnection * conn;

声明变量而不定义它。

您需要在一个源文件中添加文件范围定义,例如在 kernel.c 中:

DBConnection * conn;

于 2013-10-02T20:23:24.707 回答
2

extern不为其限定的变量分配内存,它只允许使用它。你需要一个conn没有extern. 您可以将其添加到您的 kernel.c:

DBConnection * conn;
于 2013-10-02T20:23:53.750 回答
2

尝试这个 :

#include "kernel.h"
DBConnection * conn
int get_info() {
    conn = (DBConnection *) malloc(sizeof(DBConnection));
}

需要在 kernel.c 中添加 conn 的文件范围

于 2013-10-02T20:23:57.030 回答
1

在许多文件中使用变量在任何文件中的函数之外声明它,然后extern nameofvar在其他文件中使用它,例如文件 1:

int externalvar; 

main(void)
{
    //stuff ...
}

文件 2:

extern externalvar;

void someFunc(void)
{
   externalvar = 5;
  //stuff ...
}
于 2013-10-02T20:25:14.573 回答
1

实际上这不是编译器错误,而是在链接器阶段发现的错误。因为,对于编译,extern 声明绰绰有余,因为编译器可以知道一个对象及其在其他文件中声明的类型。只要可编译文件 .c 文件知道在某处声明的对象,它就不会抛出任何错误。因此 .c 文件中的以下代码段也不会引发任何编译错误。

extern DBConnection * conn
int get_info() 
{
   conn = (DBConnection *) malloc(sizeof(DBConnection));
}

但是在链接器阶段,kernel.o(对象文件)在链接时会查找此对象引用的真实位置,到那时,如果它无法找到在其他对象文件中定义的此对象,则会引发链接器错误.

于 2013-10-04T05:43:04.993 回答
1

关键字只是说明在extern最终链接的二进制文件中某处有一个具有该名称和类型的变量,它没有定义所述变量。您收到的错误消息是关于无法找到 extern 所指的定义。

在任何函数定义之外的 .C 文件中定义您的方法。

于 2013-10-02T20:24:50.977 回答