Objective-CからC++コードを呼び出す

2021年1月31日

どもどもです。
今回は、突然ながらMacに関係する投稿です。

ソフト関係のことを勉強していて、突然Macメインの生活になり、さらにその中でMacのデスクトップツールの開発に興味が向いたので書きます。
これまでの勉強の中で作成した内容(数学の計算)をC++で実装し、さらにMacのデスクトップツールを作成する際に使用したい、というのが目標です。

1.開発環境

まず、開発に使用するMacおよび開発環境のスペックです。

Macのスペック
MAC MacBook Air
13-inch, Mid 2012
プロセッサ(CPU) MacBook Air
Intel Core i7
メモリ 8GB
ID(統合開発環境) Xcode Version 6.4

2). 作ってみた
作成するツールは、もちろん「Hello, World!」です。
コマンドラインツールです。
実際のコードは、コレ!

#include "CHello.h"
#include <iostream>

using namespace std;

void CHello::HelloFnc() {
    cout << "Hello, world!" << endl;
}
#ifndef __CppCallSample__CHello__
#define __CppCallSample__CHello__

class CHello {
public:
    CHello() {}
    ~CHello() {}
    void HelloFnc();
};

#endif /* defined(__CppCallSample__CHello__) */
#import <Foundation/Foundation.h>
        
            #include "CHello.h"
            
            int main(int argc, const char * argv[]) {
                @autoreleasepool {
                    // insert code here...
                    CHello *hello = new CHello();
                    
                    hello->HelloFnc();
                    
                    delete hello;
                }
                return 0;
            }

Xcodeの新規ウィザードに従って作成したプロジェクトとコードです。
しかし、この段階でビルドを実行しますと、エラーが発生します。
エラーの内容は、
「xxx/CHello.h:12:1: Unknown type name 'class’; did you mean 'Class’?」
「xxx/main.m:16:25: Use of undeclared identifier 'new’」
というもの。
(同じ内容が、今回の場合には「8個」出現しまいた。)
エラーの内容ですが、ざっくり言うと
「class?Classじゃねーの!?」
「new?知らねーよ!」
です。
1つ目はともかく、2つ目が問題です。
new演算子が使えない、ということになります。
この問題が解決できないと、C++のコードが使用できない、ということになります。

3.new演算子を使用するために

仰々しく書いていますが、対応作は非常に簡単です(でした)。
ソースコードの「扱い」の設定を変更するだけでOKです。
どの設定を変更するかですが、「main.m」のUtilitiesランチャー(Xcode画面の右側)の「Identity and Type」(ランチャーの一番上)の「Type」です。
デフォルトでは、この設定は「Objective-C Source」となっています。
これを「Objective-C++ Source」に変更します。
この状態で再度ビルドを実行すると、ビルドは成功します。

4.いざ実行

実行する際には、ターミナルを起動してバイナリがあるディレクトリに移動して実行です。
今回の私の環境では、「CppCallSample」というバイナリが生成されますので、ターミナル上で
「./CppCallSample」
と打てば、
「Hello, World!」
が表示されます。

5.まとめ

以上、これまでの投稿とは全く毛色の違う内容になってしまいました。
それでも誰かの参考・助けになればと思います。

ではっ!