这段代码是如何向链接器隐藏符号的

How is this code hiding the symbol from the linker?

本文关键字:链接 隐藏 符号 段代码 代码      更新时间:2023-10-16

在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中(,否则您将打破一个定义规则。