Die Verwendung von C-Funktionen in Swift erfordert einen Bridging-Header, der alle benötigten C-Funktionen enthält. Zum Beispiel myBridgingHeader.h, das #include "Car.h" und alles andere C-Zeug enthält, das Sie wollen. Ich glaube, C++ wird derzeit nicht unterstützt.
Sobald Sie den Bridging-Header haben, müssen Sie schnell darauf aufmerksam machen. Xcode-Benutzer erhalten dies kostenlos, wenn sie es dem Projekt hinzufügen. Verwenden Sie unter Linux beim Kompilieren das Flag „-import-objc-header /path/to/header“.
Bearbeiten:Ich habe unten ein vollständiges Beispiel hinzugefügt, das aus 6 Dateien besteht, für alle anderen, die diese Frage haben könnten. Es ist im Grunde dasselbe wie oben, aber das habe ich nicht gesehen, bis ich es bereits zusammengebaut hatte, haha. Außerdem kann es für jemanden nützlich sein, der mit statischen Bibliotheken verknüpfen muss.
Kopieren Sie den Dateiinhalt unten in die entsprechend benannten Dateien make
, dann ./hello
und das sollte funktionieren. Fürs Protokoll, ich habe dies nur auf der Swift-Version 2.2-dev ausgeführt (verwenden Sie swift --version
um deine zu überprüfen)
-
hallo.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; }
-
Makefile:
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
Wenn Sie aus Ihrem C-Code eine Bibliothek erstellen, können Sie ein Systemmodul erstellen dazu, die dann in Swift importiert werden können, siehe diese Antwort:Verwenden Sie eine C-Bibliothek in Swift unter Linux.
Eine andere Möglichkeit, diese Aufgabe anzugehen, besteht darin, einen Bridging-Header zu erstellen, wie von @Philip vorgeschlagen. Hier ist ein stark vereinfachtes Beispiel. Betrachten wir den folgenden C-Code:
/* In car.h */
int getInt();
/* In car.c */
int getInt() { return 123; }
Wir werden car.h als Bridging-Header verwenden. Die Swift-Quelle ist (in der Datei junk.swift
):
print("Hi from swift!")
var i = getInt()
print("And here is an int from C: \(i)!")
Erstellen Sie zuerst eine Objektdatei, car.o
, ab car.c
:
gcc -c car.c
Erstellen Sie nun eine ausführbare Datei junk
, wie folgt:
swiftc -import-objc-header car.h junk.swift car.o -o junk
Das Ausführen der ausführbaren Datei ergibt:
$ ./junk
Hi from swift!
And here is an int from C: 123!
Die -import-objc-header
Option ist ausgeblendet. Um es und eine Reihe anderer versteckter Optionen anzuzeigen, führen Sie Folgendes aus:
swiftc -help-hidden
Ich habe dies mit Swift 3.0 Development Snapshot für Ubuntu 14.04 vom 12. April gemacht, verfügbar hier:https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- SNAPSHOT-2016-04-12-a-ubuntu14.04.tar.gz
Wenn Sie jetzt C++ verwenden möchten, müssen Sie einen Wrapper erstellen, der in eine C++-Quelldatei geschrieben und mit einem C++-Compiler kompiliert wurde, jedoch mit Funktionen, die von C aus mit extern "C"
aufgerufen werden können . Diese Funktionen können dann von Swift wie jede C-Funktion aufgerufen werden. Siehe zum Beispiel diese Antwort:Kann ich Swift mit C++ mischen? Wie die Objective - C .mm-Dateien