Как этот код скрывает символ от компоновщика?

В SceneView.h:

#ifndef ProtoAlpha_SceneView_h
#define ProtoAlpha_SceneView_h

#include "cocos2d.h"#include "SceneModel.h"#include "SceneController.h"#include "CharacterModel.h"#include "CharacterDerived.h"
USING_NS_CC;

class SceneView : public CCLayer {
private:
static SceneModel* sceneModel;
static SceneView* sceneViewLayer;
static SceneController* sceneControllerLayer;
CharacterModel* t1;
CharacterModel* t2;
CCSprite* t1Sprite;

// scheduled Update
void update(float dt);

В SceneView.ccp:

CCScene* SceneView::scene() {
// 'scene' is an autorelease object
CCScene* scene = CCScene::create();

// 'layer' is an autorelease object
sceneModel = new SceneModel;
sceneViewLayer = SceneView::create();
sceneControllerLayer = new SceneController(*sceneModel->buffer);

// add layer as a child to scene
scene->addChild(sceneViewLayer);
scene->addChild(sceneControllerLayer);

// return the scene
return scene;
}

И ошибка:

Undefined symbols for architecture i386:
"SceneView::sceneModel", referenced from:
SceneView::scene() in SceneView.o
SceneView::update(float) in SceneView.o
"SceneView::sceneViewLayer", referenced from:
SceneView::scene() in SceneView.o
"SceneView::sceneControllerLayer", referenced from:
SceneView::scene() in SceneView.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

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

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

0

Решение

static SceneModel* sceneModel;
static SceneView* sceneViewLayer;
static SceneController* sceneControllerLayer;

Это все декларации, которые не являются определениями, потому что они static, Вы также должны предоставить определения для этих членов:

SceneModel* SceneView::sceneModel;
SceneView* SceneView::sceneViewLayer;
SceneController* SceneView::sceneControllerLayer;

Убедитесь, что они находятся только в одной единице перевода (возможно, в SceneView.cpp), иначе вы нарушите правило одного определения.

4

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector