链接器使用stl映射时出错

时间:2012-02-05 21:49:57

标签: c++ stl linker sdl

我收到以下链接器错误:

  

错误1错误LNK2001:未解析的外部符号“private:static class std :: map,class std :: allocator&gt ;, struct SDL_Surface *,struct std :: less,class std :: allocator>>,class std :: allocator,class std :: allocator> const,struct SDL_Surface *>>> CSurface :: loadedSurfaces“(?loadedSurfaces @ CSurface @@ 0V?$ map @ V?$ basic_string @ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ PAUSDL_Surface @@ U&$ @少V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ 2 @ @std @@@ 2 @ V'$分配器@ U&$ @配对$$ CBV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ PAUSDL_Surface @@ @std @@@ 2 @@ std @@ A)CSurface.obj

CSurface编译单元的头文件和cpp文件的代码位于:

IdeOne.com code post

导致此链接器错误的原因是什么:(它让我发疯了。

2 个答案:

答案 0 :(得分:2)

您已声明loadedSurfaces,但尚未对其进行定义。您需要将以下内容添加到一个转换单元中才能实际声明变量:

map<string, SDL_Surface*> CSurface::loadedSurfaces;

就像现在一样,类定义中的loadedSurfaces就像函数的原型一样。当您尝试使用它时,链接器会查找它,因为它看到了前向声明,但它从未在任何地方找到实际的定义。你必须给它一个定义,并且链接器会满意,因为它知道每个人在使用名称loadedSurfaces时所讨论的实际翻译单元中的实际变量。

答案 1 :(得分:2)

CSurface::loadedSurfaces已声明但未定义。将以下内容添加到.cpp文件中:

map<string, SDL_Surface*> CSurface::loadedSurfaces;