GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kompilieren Sie C-Code und stellen Sie ihn Swift unter Linux zur Verfügung

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


Linux
  1. Linux – Wie überprüft man, ob eine Linux-Distribution sicher ist und keinen bösartigen Code enthält?

  2. Wie kann man eine ausführbare Linux-Datei zerlegen, ändern und dann wieder zusammensetzen?

  3. Wie erstellt man Visual Studio Solution unter Linux?

  4. Kompilieren und erstellen Sie mit einer einzigen Befehlszeile Java (Linux)

  5. Wie kann ausführbarer Code auch unter Speicherdruck im Speicher gehalten werden? unter Linux

So kompilieren Sie C, C++ und Java mit Terminal unter Linux

So kompilieren und führen Sie C- und C++-Programme unter Linux aus

Wie man ein C-Programm unter Linux kompiliert und ausführt

Ein Windows-Typ in einer Linux-Welt:VS-Code und Remote-SSH

Bester Linux-Code-Editor:Top 11 überprüft und verglichen

Wie kann ich Codeabdeckung für Swift-Pakete unter Linux oder OS X generieren?