我有一个头文件,可以说Common.h,它包含在几个项目中的所有文件中。基本上我想,当我做这个,我得到吨链接错误的说法在全局头文件中声明一个全局变量?
类的MemoryManager * gMemoryManager已定义声明一个全局变量,例如:
class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;
。
:(?
我有一个头文件,可以说Common.h,它包含在几个项目中的所有文件中。基本上我想,当我做这个,我得到吨链接错误的说法在全局头文件中声明一个全局变量?
类的MemoryManager * gMemoryManager已定义声明一个全局变量,例如:
class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;
。
:(?
因为它是你在每个编译文件创建变量的单独副本。这些都是然后在连接阶段发生碰撞。记住,预处理器中的所有头文件读取,使一个大文件了所有的人的。所以每个这个大文件编译时间,创建的gMemoryManager
另一个完全相同的副本。
您需要使用extern
和一个非头文件中定义它。
在你头文件
个extern DLL_EXPORT MemoryManager* gMemoryManager;
在你的C++一个文件
DLL_EXPORT MemoryManager * gMemoryManager;
通过我不知道DLL_EXPORT做什么的样子,我只是假设,它需要在这两个地方去。
这
MemoryManager* gMemoryManager;
限定的变量。如果您在标题中执行此操作,则将在包含该标题的每个翻译单元中定义该变量,因此会导致链接器错误。如果你想申报一个变量,这样来做:
extern DLL_EXPORT MemoryManager* gMemoryManager;
,并且将定义为只有一个CPP文件。
当你想分享其中在C++中多个源文件中的全局变量,你只需要在一个头文件(.h)中作为
extern typeName variableName;
也仅仅是相应的源文件(申报。 CPP)应包含定义
typeName variableName;
的的extern关键字是必需的,以区分定义的声明。
从函数库中导出函数时,这是MS特定的扩展,用于处理C++名称加密。 – 2009-10-16 15:14:48
它是否需要在头文件和声明?我不想提供一些错误的信息。谢谢。 – 2009-10-16 15:16:48
根据我的经验,宏'DLL_EXPORT'通常用于为Microsoft编译器定义'__declspec(dllexport)'。 的#if定义(WIN32) 的#define DLL_EXPORT __declspec(DLLEXPORT) 的#else 的#define DLL_EXPORT #ENDIF 如果没有 '__declspec(dllexport)的' 编译器不会使变量可见在DLL中。 它不在头文件之外。 – gnash117 2013-03-28 16:32:06