2011-04-19 92 views
2

我有以下两个文件:VS2010与extern关键字

  1. foo.h中
  2. bar.cpp

foo.h我decleare变量extern

现在,我想在bar.cpp(包括foo.h之后)使用相同的变量。

在VS2008和VS2010下,我得到unresolved external symbol错误,而在Ubuntu下使用gcc编译成功。

(即,我试图编译以下源代码:http://www.fromdual.com/using-mysql-user-defined-functions-udf; foo.h是指srv0srv.h,bar.cpp是指源代码。所有包含都已到位,编译成功,链接下降)

问题可能是什么?

回答

0

问题是,前面提到的符号必须从dll中导出(通过dllspec)才能从外部看到。只有extern关键字不允许从外部看到它。

3

extern关键字向编译器指示它后面的变量已经在其他地方声明过了。它实际上并没有为变量分配空间。如果你想通过包含一个头文件来创建一个可以使用的全局变量(顺便说一句,这通常是一个坏主意),你可以通过以下方式来完成。

foo.h中:

extern int myVar; 

在Foo.cpp中:

int myVar; 

myVar的现在位于Foo.cpp中,但foo.h中extern语句,允许在其他文件中的代码(如bar.cpp)通过包含foo.h来访问它。

0

当您使用extern来声明变量(其他源对象或文件中的全局变量)时,您实际上告诉编译器在其他地方查找变量的定义。在这种情况下,您需要提供另一个定义为int myVar的源文件。

0

您的变量必须在其中一个源文件的某处引用。通过extern关键字,你只能告诉“有一个变量”,但链接器必须知道它的位置。在编译源代码时,它会为变量创建引用等。链接程序将根据这些引用链接。如果你实际上没有创建一个引用变量链接器将无法找到引用,所以它会给出错误。如果您使用extern,则表示不要在此处创建对此变量或任何其他事物的引用。但是在其他地方必须提到它。

+0

谢谢!我不明白,为什么代码能够编译,但是在VS2010中没有链接,为什么它能在linux下使用gcc? – krisy 2011-04-20 06:57:18