目的

ネット上だとiOSプロジェクトから直接C++は呼び出せないとか、objecteve-c++でラップしないとダメとか言われてるけど。
簡単なC++ファイルだったら呼び出せる。
※C++の値を利用とか、返り値もらったりするのは難しい!?

それでこの記事では、swiftから簡易的なC++の処理を呼び出す方法メモ

C++はあまり詳しくないので、勘違い箇所ありましたらスミマセヌ。

環境

  • Xcode Version 13.3.1
  • Swift 5

参照サイト

ObjectiveCからC++
上記でだいたい解決しているのですが、この記事ではswiftからの呼び出しという点とちょっと解説ポイントが違うので記事化しました。

対応メモ

ファイル作成

いつものようにproject作成後、C++ファイルも追加する。
New File...よりC++ Fileを選択


Xcode 13.3.1だとこの後、bridging headerも一緒に作らない?と聞かれるので
Create Bridging Headerを選択

C++のファイル設定

C++プログラムファイルとして以下のヘッダー、ソースを設定
C++ヘッダーファイルは以下
参照する関数をextern "C" { ... } で囲む必要があるのと、
それをさらに
#ifdef __cplusplus ... #endif
で囲む

helloworld.hpp
#ifndef helloworld_hpp
#define helloworld_hpp

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif
    void printHello();

#ifdef __cplusplus
}
#endif

#endif /* helloworld_hpp */

C++ソースファイルは以下
こちらは特に改変無し。

helloworld.cpp
#include "helloworld.hpp"

void printHello() {
    printf("hello world");
}

Bridging-Header.hファイルには、作成したC++のファイル名を記載。

xxx-Bridging-Header.h
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#include "helloworld.hpp"

swiftからは以下のように呼び出す

ViewController.swift
...

printHello()

...

アプリを実行するとコンソールに以下の文字列が記載されて、
cppファイルが呼び出されていることが確認できる。

所感

C++ファイルの関数を呼び出す際は
extern "C" { ... } で囲む必要があるよう。
それでこれだけだとエラーになり、これを回避するには#ifdef __cplusplus ... #endifでこれを囲む必要がある。

C++側ではコメント出力という簡素なことしかしておらず、あまり役に立たない事例かも。
それでXcode12までだとここまでする必要なかったような。。。

Xcode13から仕様変わった!?

所感-2

C++なんかとなんで連携するかというとOpenGLと親和性が高いということを聞いたりしてライブラリがC++でしか書かれたものがないという事例もあるが。

なんかiOS12ぐらいからOpenGLが非推奨になってる!?的な噂もある。
ソース無し。

新規で利用する場合はここらへんも考慮しないとな。