О команде компоновщика не удалось с кодом выхода 1

Я определил пространство имен «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;
}

Если бы кто-то мог четко объяснить, почему ошибка исчезла, я был бы всегда благодарен.

1

Решение

Это довольно распространенная ошибка из-за того, что любой файл реализации, содержащий этот заголовок, будет содержать определение этих переменных. Это приведет к дублированию символов во время ссылки.

Это решено определяющий один экземпляр каждого из этих объектов в новом, отдельном, .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;

Также обратите внимание, что вы можете поместить эти переменные в класс, который может быть правильно инициализирован и может поддерживать все положительные аспекты ориентации объекта.

1

Другие решения


По вопросам рекламы [email protected]