GNU/Linux >> Linux Esercitazione >  >> Linux

Compila il codice C ed esponilo a Swift sotto Linux

L'utilizzo delle funzioni C in Swift richiede un'intestazione di bridging che includa tutte le funzionalità C necessarie. Ad esempio, myBridgingHeader.h che contiene #include "Car.h" e qualunque altra cosa C desideri. Credo che C++ non sia attualmente supportato.

Una volta che hai l'intestazione del ponte, devi rendertene conto rapidamente. Gli utenti di Xcode lo ottengono gratuitamente quando lo aggiungono al progetto. In Linux, usa il flag '-import-objc-header /path/to/header' durante la compilazione.

Modifica:ho aggiunto un esempio completo di seguito composto da 6 file per tutti gli altri che potrebbero avere questa domanda. Fondamentalmente è uguale a quello sopra, ma non l'ho visto fino a quando non l'avevo già messo insieme ahah. Inoltre, potrebbe essere utile per qualcuno che ha bisogno di collegarsi a librerie statiche.

Copia il contenuto del file di seguito in file con nome appropriato, make , quindi ./hello e dovrebbe funzionare. Per la cronaca, l'ho eseguito solo su swift versione 2.2-dev (usa swift --version per controllare il tuo)

  • ciao.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
    
  • multi.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
    

Se costruisci una libreria dal tuo codice C, puoi creare un modulo di sistema per questo, che può quindi essere importato in Swift, vedi questa risposta:Usa una libreria C in Swift su Linux.

Un altro modo per affrontare questa attività è creare un'intestazione di bridging, come suggerito da @Philip. Ecco un esempio semplificato. Consideriamo il seguente codice C:

/* In car.h */
int getInt();

/* In car.c */
int getInt() { return 123; }

Useremo car.h come intestazione di bridging. La fonte rapida è (nel file junk.swift ):

print("Hi from swift!")
var i = getInt()
print("And here is an int from C: \(i)!")

Innanzitutto, crea un file oggetto, car.o , da car.c :

gcc -c car.c

Ora crea un eseguibile, junk , come segue:

swiftc -import-objc-header car.h junk.swift car.o -o junk

L'esecuzione dell'eseguibile dà:

$ ./junk
Hi from swift!
And here is an int from C: 123!

Il -import-objc-header l'opzione è nascosta. Per vederlo e un sacco di altre opzioni nascoste, esegui:

swiftc -help-hidden 

L'ho fatto utilizzando l'istantanea di sviluppo Swift 3.0 per Ubuntu 14.04 del 12 aprile, disponibile qui:https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- SNAPSHOT-2016-04-12-a-ubuntu14.04.tar.gz

Ora, se vuoi usare C++, dovrai creare un wrapper, scritto in un file sorgente C++ e compilato con un compilatore C++, ma con funzioni richiamabili da C usando extern "C" . Queste funzioni possono quindi essere chiamate da Swift come qualsiasi funzione C. Vedi, ad esempio, questa risposta:posso mescolare Swift con C++? Come i file Objective - C .mm


Linux
  1. Come compilare e installare software dal codice sorgente su Linux

  2. Creazione e rimozione di file e directory in Linux

  3. Come eseguire il tar, decomprimere i file e visualizzare il contenuto del file tar sotto Linux

  4. Come creare una soluzione Visual Studio sotto Linux?

  5. Compilare e creare con una singola riga di comando Java (Linux)

Come compilare C, C++ e Java utilizzando Terminal su Linux

Come compilare ed eseguire programmi C, C++ in Linux

Come compilare ed eseguire il programma C in Linux

Un ragazzo Windows in un mondo Linux:VS Code e SSH remoto

Miglior editor di codice Linux:i primi 11 recensiti e confrontati

Come posso generare la copertura del codice per i pacchetti Swift su Linux o OS X?