我有以下两个文件:
在foo.h
中,我取消变量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 :(得分:3)
extern 关键字向编译器指示其后面的变量已在其他地方声明。它实际上并没有为变量分配空间。如果你想创建一个可以通过包含头文件来使用的全局变量(顺便说一下这通常是一个坏主意),你可以通过以下方式完成它。
在foo.h中:
extern int myVar;
在foo.cpp中:
int myVar;
myVar现在位于foo.cpp中,但foo.h中的extern语句允许其他文件(例如bar.cpp)中的代码通过包含foo.h来访问它。
答案 1 :(得分:0)
当您使用extern
声明变量(其他源对象或文件中的全局变量)时,您实际上告诉编译器在其他地方查找变量的定义。在这种情况下,您需要提供另一个定义int myVar
的源文件。
答案 2 :(得分:0)
您的变量必须在其中一个源文件中有某个引用。通过extern
关键字,您只能告诉“有一个变量”,但链接器必须知道它的位置。在编译源代码时,它将为变量等创建引用。链接器将根据这些引用进行链接。如果您实际上没有创建对变量链接的引用将无法找到引用,那么它将给出错误。如果您使用extern
,则表示不要在此处创建对此变量或任何其他内容的引用。但是必须在其他地方提及它。
答案 3 :(得分:0)
问题是,必须从dll导出(通过dllspec)提供的符号,以便从外部可见。只有extern关键字不允许从外面看到它。