Swift で C 関数を使用するには、必要なすべての C 機能を含むブリッジ ヘッダーが必要です。たとえば、 #include "Car.h" を含む myBridgingHeader.h と、必要なその他の C 要素が含まれています。 C++ は現在サポートされていないと思います。
ブリッジング ヘッダーを取得したら、迅速にそれを認識させる必要があります。 Xcode ユーザーは、これをプロジェクトに追加すると無料で入手できます。 Linux では、コンパイル時に「-import-objc-header /path/to/header」フラグを使用します。
編集:この質問がある可能性のある他の人のために、6 つのファイルで構成される完全な例を以下に追加しました。基本的には上記のものと同じですが、すでに組み立てるまではわかりませんでした。また、静的ライブラリにリンクする必要がある人にも役立つかもしれません。
以下のファイルの内容を適切な名前のファイル make
にコピーします 、次に ./hello
そしてそれはうまくいくはずです。記録のために、私はこれを迅速なバージョン 2.2-dev でのみ実行しました (swift --version
を使用) あなたのものを確認してください)
-
hello.swift:
let n: Int32 = 5 print("Hello, Swift World!") print("mult2(\(n,N)) = \(mult2(n,N))") print("CONST1=\(CONST1), CONST2=\(CONST2), CONST3=\(CONST3)")
-
bridge.h:
#include "defs.h" #include "mult.h"
-
defs.h:
#define CONST1 1 #define CONST2 2 #define CONST3 3
-
mult.h:
#define N 7 int mult2(int,int);
-
mult.c:
#include "defs.h" #include "mult.h" int mult2(int a, int b) { return a*b; }
-
メイクファイル:
all: hello hello: libmult.a swiftc hello.swift -import-objc-header ./bridge.h -L. -lmult -o hello libmult.a: mult.o ar -rc libmult.a mult.o ranlib libmult.a mult.o: mult.c mult.h defs.h gcc -c mult.c -o mult.o .PHONY: clean clean: rm -f *.o *.a hello
C コードからライブラリを構築する場合、システム モジュールを作成できます。 それについては、Swift にインポートできます。この回答を参照してください:Linux の Swift で C ライブラリを使用してください。
このタスクにアプローチする別の方法は、@Philip で提案されているように、ブリッジ ヘッダーを作成することです。以下は単純化しすぎた例です。次の C コードを考えてみましょう:
/* In car.h */
int getInt();
/* In car.c */
int getInt() { return 123; }
ブリッジ ヘッダーとして car.h を使用します。迅速なソースは(ファイル内 junk.swift
):
print("Hi from swift!")
var i = getInt()
print("And here is an int from C: \(i)!")
まず、オブジェクト ファイル car.o
を作成します。 、 car.c
から :
gcc -c car.c
実行可能ファイル junk
をビルドします 、次のように:
swiftc -import-objc-header car.h junk.swift car.o -o junk
実行可能ファイルを実行すると:
$ ./junk
Hi from swift!
And here is an int from C: 123!
-import-objc-header
オプションは非表示です。それと他の隠しオプションを見るには、以下を実行してください:
swiftc -help-hidden
4 月 12 日の Ubuntu 14.04 用の Swift 3.0 開発スナップショットを使用してこれを行いました。 SNAPSHOT-2016-04-12-a-ubuntu14.04.tar.gz
ここで、C++ を使用する場合は、C++ ソース ファイルで記述され、C++ コンパイラでコンパイルされたラッパーを作成する必要がありますが、extern "C"
を使用して C から呼び出し可能な関数が含まれています。 .これらの関数は、任意の C 関数として Swift から呼び出すことができます。たとえば、次の回答を参照してください:Can I mix Swift with C++? Objective と同様 - C .mm ファイル