找不到体系结构i386 cpp/mm文件的符号

symbol(s) not found for architecture i386 cpp/mm files

本文关键字:文件 符号 mm 体系结构 i386 cpp 找不到      更新时间:2023-10-16

我正在使用Cocos2D,我创建了一个Singleton C++类,它将存储游戏设置信息。这就是我的课的样子:

#include <cstddef>
#ifndef __pyramidofdoom__GameSettings__
#define __pyramidofdoom__GameSettings__

#endif /* defined(__pyramidofdoom__GameSettings__) */
 class GameSettings {
 private:
  static GameSettings* mGameSettings;
  GameSettings(){ mGameSettings = this; }
  int rowSelected = 0;

public:
GameSettings *getInstance() {
    if (mGameSettings == NULL)
        mGameSettings = new GameSettings();
        return mGameSettings;
};
int getSelectedRow() { return rowSelected; }
void setSelectedRow(int row) { rowSelected = row;}

};

这就是我在cocos2D mm文件中使用它的方式:

        GameSettings *gameSettings = gameSettings->getInstance();
        if(multi)
            gameSettings->setSelectedRow(3);
        else
            gameSettings->setSelectedRow(1);

看起来很基本,一切都很好。

这是我现在尝试构建时遇到的错误:

 Undefined symbols for architecture i386:
 "GameSettings::mGameSettings", referenced from:
     GameSettings::getInstance() in GameLayer-E06C3150ABD8625A.o
    GameSettings::GameSettings() in GameLayer-E06C3150ABD8625A.o
 ld: symbol(s) not found for architecture i386
 clang: error: linker command failed with exit code 1 (use -v to see invocation)

我确保cpp/h文件包含在"构建阶段"下的"编译源"中。我还添加了libc++库,看看是否可以修复它。

#import和使用cpp类的任何标头或实现也必须使用.mm扩展。

因此,如果你导入GameSettings.h并在GameLayer.m中使用GameSettingscpp类,你必须将其重命名为GameLayer.mm.

您可能更喜欢使用Objective-C类。理想情况下,完全废弃整个单例。例如,对应用程序启动时实例化的设置类的应用程序内委托引用也同样有效。

您已经声明了mGameSettings,但没有定义它。您需要在源文件中进行定义:

GameSettings* mGameSettings = NULL;

或者,您可以将其设为本地静态变量:

GameSettings *getInstance() {
    static GameSettings instance;
    return instance;
}

它具有不泄漏内存和线程安全的优点(在一致的C++11编译器中),如果这对你很重要的话。

或者,去掉singleton。它们几乎从来都不是一个好主意(单态有什么不好的?),尤其是在C++中,除了模式中固有的过度耦合和受限的可测试性之外,还会遇到许多生存期问题。

此外,不要为包含保护使用保留名称:在C++标识符中使用下划线的规则是什么?更重要的是,它应该保护整个头部——你的没有任何作用。