Я определил пространство имен «MAPDATA» в файле заголовка (MapData.h), который я создал, и я определил переменную в
«MapData».
MapData.h
namespace MAPDATA{
cocos2d::CCSize MapSizeData;
cocos2d::CCSize TileSizeData;
int MaxTileXData;
int MaxTileYData;
}
Однако, если я напишу #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» в класс else, ошибка исчезнет.
После удаления имени пространства имен
namespace {
cocos2d::CCSize MapSizeData;
cocos2d::CCSize TileSizeData;
int MaxTileXData;
int MaxTileYData;
}
Если бы кто-то мог четко объяснить, почему ошибка исчезла, я был бы всегда благодарен.
Это довольно распространенная ошибка из-за того, что любой файл реализации, содержащий этот заголовок, будет содержать определение этих переменных. Это приведет к дублированию символов во время ссылки.
Это решено определяющий один экземпляр каждого из этих объектов в новом, отдельном, .cpp
файл. Также мне не понятно, почему вы используете namespace
без имени
Итак, сначала объявите эти объекты с extern
:
MapData.h:
extern cocos2d::CCSize MapSizeData;
extern cocos2d::CCSize TileSizeData;
extern int MaxTileXData;
extern int MaxTileYData;
А затем добавьте исходный файл, содержащий определение из этих объектов:
MapData.cpp:
#include "MapData.h"#include .... // other files
cocos2d::CCSize MapSizeData;
cocos2d::CCSize TileSizeData;
int MaxTileXData;
int MaxTileYData;
Также обратите внимание, что вы можете поместить эти переменные в класс, который может быть правильно инициализирован и может поддерживать все положительные аспекты ориентации объекта.