1

我在我创建的头文件(MapData.h)中定义了命名空间“MAPDATA”,并在“MAPDATA”中定义了一个变量。

地图数据.h

namespace MAPDATA{

cocos2d::CCSize MapSizeData;
cocos2d::CCSize TileSizeData;
int MaxTileXData;
int MaxTileYData;
}

但是,如果我在 else 类中写 #include "MapData.h",Linker 会出现以下错误。

duplicate symbol __ZN7MAPDATA11MapSizeDataE in:
    /Users/nyoronyoro-kun/Desktop/出力先/Build/Intermediates/tilegame.build/Debug-iphonesimulator/tilegame.build/Objects-normal/i386/TileMapManage.o
    /Users/nyoronyoro-kun/Desktop/出力先/Build/Intermediates/tilegame.build/Debug-iphonesimulator/tilegame.build/Objects-normal/i386/MapData.o
duplicate symbol __ZN7MAPDATA12TileSizeDataE in:
    /Users/nyoronyoro-kun/Desktop/出力先/Build/Intermediates/tilegame.build/Debug-iphonesimulator/tilegame.build/Objects-normal/i386/TileMapManage.o
    /Users/nyoronyoro-kun/Desktop/出力先/Build/Intermediates/tilegame.build/Debug-iphonesimulator/tilegame.build/Objects-normal/i386/MapData.o
duplicate symbol __ZN7MAPDATA12MaxTileXDataE in:
    /Users/nyoronyoro-kun/Desktop/出力先/Build/Intermediates/tilegame.build/Debug-iphonesimulator/tilegame.build/Objects-normal/i386/TileMapManage.o
    /Users/nyoronyoro-kun/Desktop/出力先/Build/Intermediates/tilegame.build/Debug-iphonesimulator/tilegame.build/Objects-normal/i386/MapData.o
duplicate symbol __ZN7MAPDATA12MaxTileYDataE in:
    /Users/nyoronyoro-kun/Desktop/出力先/Build/Intermediates/tilegame.build/Debug-iphonesimulator/tilegame.build/Objects-normal/i386/TileMapManage.o
    /Users/nyoronyoro-kun/Desktop/出力先/Build/Intermediates/tilegame.build/Debug-iphonesimulator/tilegame.build/Objects-normal/i386/MapData.o
ld: 4 duplicate symbols for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

但是,如果我删除名称空间的名称(MAPDATA)并在其他类中写入#include“MapData.h”,错误就会消失。

删除命名空间名称后

namespace {

cocos2d::CCSize MapSizeData;
cocos2d::CCSize TileSizeData;
int MaxTileXData;
int MaxTileYData;
}

如果有人能清楚地解释为什么错误消失了,我将永远感激不尽。

4

1 回答 1

1

这是一个相当常见的错误,因为任何包含该头文件的实现文件都将包含这些变量的定义。这将导致链接期间出现重复的符号。

它通过在一个新的、单独的文件中定义每个对象的单个实例来解决。.cpp我也不清楚你为什么使用namespace没有名字的。

所以首先声明这些对象extern

地图数据.h:

extern cocos2d::CCSize MapSizeData;
extern cocos2d::CCSize TileSizeData;
extern int MaxTileXData;
extern int MaxTileYData;

然后添加一个包含这些对象定义的源文件:

地图数据.cpp:

#include "MapData.h"
#include ....   // other files

cocos2d::CCSize MapSizeData;
cocos2d::CCSize TileSizeData;
int MaxTileXData;
int MaxTileYData;

另请注意,您可能希望将这些变量放入一个类中,该类可以正确初始化并可以保持面向对象的所有积极方面。

于 2014-07-04T06:39:02.813 回答