VS2010 带 extern 关键字

Posted

技术标签:

【中文标题】VS2010 带 extern 关键字【英文标题】:VS2010 with extern keyword 【发布时间】:2011-04-19 15:08:23 【问题描述】:

我有以下两个文件:

    foo.h bar.cpp

foo.h 中,我清除了一个变量extern

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

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

(即我正在尝试编译以下源码:http://www.fromdual.com/using-mysql-user-defined-functions-udf;foo.h指的是srv0srv.h,bar.cpp指的是源代码。所有include都到位,编译成功,链接跌倒)

可能是什么问题?

【问题讨论】:

【参考方案1】:

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

在 foo.h 中:

extern int myVar;

在 foo.cpp 中:

int myVar;

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

您的变量必须在某个源文件中的某处有引用。通过extern 关键字,您只是在告诉“有一个变量”,但链接器必须知道它的位置。在编译源代码时,它将为变量等创建引用。链接器将根据这些引用进行链接。如果没有实际创建变量的引用,链接器将无法找到该引用,因此会报错。如果您使用extern,您的意思是不要在此处创建对此变量或任何其他内容的引用。但是必须在其他地方引用它。

【讨论】:

谢谢!什么我不明白,为什么代码在VS2010中可以编译,但是没有链接,为什么在linux下可以和gcc一起工作?【参考方案4】:

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

【讨论】:

以上是关于VS2010 带 extern 关键字的主要内容,如果未能解决你的问题,请参考以下文章

extern 关键字对 C 函数的影响

C/C++中extern关键字详解

让VS2010/VS2012添加新类时自动添加public关键字

如何使用 extern 在源文件之间共享变量?

C语言vs怎么使用自己做的静态库与动态库,本人小白,请求详解

vs 2010代码片段