В 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, ошибка компоновщика исчезла бы, поэтому вряд ли это будет ошибка исходного кода компиляции.
После небольшого поиска я нашел несколько человек, ссылающихся на то, что символ для этого кода может быть каким-то образом скрыт, я хочу понять, что на самом деле здесь происходит.
static SceneModel* sceneModel;
static SceneView* sceneViewLayer;
static SceneController* sceneControllerLayer;
Это все декларации, которые не являются определениями, потому что они static
, Вы также должны предоставить определения для этих членов:
SceneModel* SceneView::sceneModel;
SceneView* SceneView::sceneViewLayer;
SceneController* SceneView::sceneControllerLayer;
Убедитесь, что они находятся только в одной единице перевода (возможно, в SceneView.cpp
), иначе вы нарушите правило одного определения.
Других решений пока нет …