Linuxで動かすswiftからC++のコードが呼びたい

どうも,まるさ@maruuusa83です.

xcodeを使わない,CLIのswiftからC++コード呼び出すのにちょっと困ったのでメモします(初心者丸出し)

Linuxとかでswift書いてて困った人どうぞ







知っておくべきこと

  • swiftからはC/Objective-Cしか呼び出せない
  • swiftcを使うと-import-obj-headerでブリッジヘッダが指定できる

適当にググるxcode使ってる場合の情報ばかりなので困りましたが,なんとかなりました.

ブリッジするときC++成分があるとSwiftが怒るので注意します.







C++のコードのオブジェクトファイルを用意する

後でリンカに食わせるC++バイナリが必要になります.

Cとくっつけるためにextern "C"したC向けWrapperを用意する必要があります.


HelloSwift.cpp

#include <iostream>

class HelloSwift
{
public:
    void hello_swift_from_cpp()
    {
        std::cout << "Hello Swift from C++!\n" << std::endl;
    }
};

extern "C" void helloswift(void)
{
    HelloSwift hs = HelloSwift();
    hs.hello_swift_from_cpp();
}


オブジェクトファイルつくりましょう.


$ g++ -c HelloSwift.cpp



ブリッジヘッダファイルを用意する

Swfitで読み込むCかObjective-Cのヘッダファイルを用意します. ここでC++成分が残っていると文句を言ってきますので注意.

具体的には,C++のときにextern "C"しておいたWrapper群を列挙します.


bridge.h

void helloswift(void);



swiftをかく

ここまでくるとC++コードがswiftから呼べるようになります.うれしい. ヘッダはコマンドオプションで直接指定するのでimportの必要はありません.

test.swift

// bridge.h is imported

helloswift()



swiftcする

先ほど書いたブリッジヘッダファイルを-import-objc-headerで指定しておくのがミソ.あと,C++のオブジェクトファイルも渡しておきます.


$ swiftc -import-objc-header bridge.h test.swift HelloSwift.o
$ ./main
Hello Swift!


動いた!







それでは,今回はこのへんで ノ

まるさ