15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【iOS】Xcodeでビルドした時にNSObjCRuntimeでエラー?【cocos2d-x】

Posted at

また謎のエラー…

Xcodeでビルドした時に謎のエラーが出る事があります。
「え、チェックアウトしただけで、特に何もコード変えてないのに何でエラー!?」
なんて事もあります。
もちろんエラーは状況により様々ですが、その中でもcocos2d-xを使っていると
出会うかもしれないエラーとその解決法をご紹介します。

サンプルを作成

全体のコードはgithubにUP致しました。→コチラ

今回はエラーを発生させる可能性がある、iOS , aOSで処理を切り分ける必要があるプログラムをcocos2d-xで用意しました。
なお、使用したcocos2d-xのVersionは3.3rc0です。

NativeUtil.h
//  NativeUtil.h
#ifndef __Cocos2dxNSObjCRuntimeErrorTest__NativeUtil__
#define __Cocos2dxNSObjCRuntimeErrorTest__NativeUtil__

#include <stdio.h>

class NativeUtil
{
public:
    static void showWebBrowser(std::string url);
};

#endif /* defined(__Cocos2dxNSObjCRuntimeErrorTest__NativeUtil__) */
NativeUtil.cpp
//  NativeUtil.cpp
#include "NativeUtil.h"


#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#import <objc/runtime.h>
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#endif

/**
 * URLを指定して端末ブラウザと連携する
 */
void NativeUtil::showWebBrowser(std::string url)
{
    NSString *urlString = [NSString stringWithFormat:@"%s" , url.c_str()];
    NSURL *nsUrl = [NSURL URLWithString:urlString];
    
    // ブラウザを起動する
    [[UIApplication sharedApplication] openURL:nsUrl];
}

動作確認

こんな感じです。
あくまでサンプルなので、サラッと読み飛ばしてください。

真ん中のボタンを押下すると端末ブラウザと連携します。
iOS Simulator Screen Shot 2014.10.26 18.51.31.png

この例ではcocos2d-xのウェブサイトに遷移させました。
iOS Simulator Screen Shot 2014.10.26 18.51.37.png

え?NSObjCRuntimeエラー!?

エラーを発生させました。こんなエラーです。
スクリーンショット 2014-10-26 18.52.33.png

こういうエラーは特に見たくないですね。

原因

これが原因です。
スクリーンショット 2014-10-26 19.14.18.png

この
「Type : Default - C++ Source」
が原因でこのエラーは発生します。

エラーの内容を読むと

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:397:1: error: expected unqualified-id
@class NSString, Protocol;
^
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:399:19: error: unknown type name 'NSString'
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);

とこんな感じなのですが、
噛み砕いて説明しますと、

・C++のコード内にObjective-Cのコードが混ざっているのだが、そのObjective-Cのコードが認識出来ない

こんなエラー内容になります。
また恐らくですが、ファイル拡張子がcppの時のみ発生するエラーなのでは無いかと思われます。

解決法

二通りあります。

1. ファイル拡張子を「.mm」に変更する

これはそのままですね。
ご存知の通り、.mmにすると自動的にObj-C++ファイルになりますので、
混在コードでもXcodeが自動で認識してくれます。

2. Typeを「Objective-C++ Source」に変更する

指定のcppファイルを選択すると、そのファイルのTypeを見ることが出来ます。
それを以下の通り、Objective-C++ Source に変えてあげればOKです。
スクリーンショット 2014-10-26 19.28.10.png

これでビルドが通るようになります。

最後に

出来ればこういうエラーには出会いたくない…。
滅多な事では出会うことは無いと思いますが、
万が一出会ってしまった方の助けになれば幸いです。

15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?