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 关键字的主要内容,如果未能解决你的问题,请参考以下文章
让VS2010/VS2012添加新类时自动添加public关键字