Linuxで動かすswiftからC++のコードが呼びたい
どうも,まるさ@maruuusa83です.
xcodeを使わない,CLIのswiftからC++コード呼び出すのにちょっと困ったのでメモします(初心者丸出し)
Linuxとかでswift書いてて困った人どうぞ
知っておくべきこと
- swiftからはC/Objective-Cしか呼び出せない
swiftc
を使うと-import-obj-header
でブリッジヘッダが指定できる
適当にググるとxcode使ってる場合の情報ばかりなので困りましたが,なんとかなりました.
ブリッジするときC++成分があるとSwiftが怒るので注意します.
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!
動いた!
それでは,今回はこのへんで ノ
まるさ