GNU/Linux >> Tutoriels Linux >  >> Linux

Compiler le code C et l'exposer à Swift sous Linux

L'utilisation des fonctions C dans Swift nécessite un en-tête de pontage qui inclut toutes les fonctionnalités C dont vous avez besoin. Par exemple, myBridgingHeader.h qui contient #include "Car.h" et tout autre élément C que vous voulez. Je crois que C++ n'est actuellement pas pris en charge.

Une fois que vous avez l'en-tête de pontage, vous devez en informer Swift. Les utilisateurs de Xcode l'obtiennent gratuitement lorsqu'ils l'ajoutent au projet. Sous Linux, utilisez l'indicateur '-import-objc-header /path/to/header' lors de la compilation.

Edit :J'ai ajouté un exemple complet ci-dessous composé de 6 fichiers pour tous ceux qui pourraient avoir cette question. C'est fondamentalement le même que celui ci-dessus mais je ne l'ai pas vu jusqu'à ce que je l'aie déjà assemblé haha. En outre, cela peut être utile pour quelqu'un qui a besoin d'établir un lien avec des bibliothèques statiques.

Copiez le contenu du fichier ci-dessous dans des fichiers nommés de manière appropriée, make , puis ./hello et ça devrait marcher. Pour mémoire, je n'ai exécuté ceci que sur la version 2.2-dev de Swift (utilisez swift --version pour vérifier le vôtre)

  • bonjour.swift :

    let n: Int32 = 5
    print("Hello, Swift World!")
    print("mult2(\(n,N)) = \(mult2(n,N))")
    print("CONST1=\(CONST1), CONST2=\(CONST2), CONST3=\(CONST3)")
    
  • pont.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);
    
  • multi.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
    

Si vous construisez une bibliothèque à partir de votre code C, vous pouvez créer un module système pour cela, qui peut ensuite être importé dans Swift, consultez cette réponse :Utiliser une bibliothèque C dans Swift sous Linux.

Une autre façon d'aborder cette tâche consiste à créer un en-tête de pontage, comme suggéré par @Philip. Voici un exemple trop simplifié. Considérons le code C suivant :

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

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

Nous utiliserons car.h comme en-tête de pontage. La source rapide est (dans le fichier junk.swift ):

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

Tout d'abord, créez un fichier objet, car.o , à partir de car.c :

gcc -c car.c

Construisez maintenant un exécutable, junk , comme suit :

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

L'exécution de l'exécutable donne :

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

Le -import-objc-header option est masquée. Pour le voir et un tas d'autres options cachées, exécutez :

swiftc -help-hidden 

Je l'ai fait en utilisant l'instantané de développement Swift 3.0 pour Ubuntu 14.04 du 12 avril, disponible ici :https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- INSTANTANÉ-2016-04-12-a-ubuntu14.04.tar.gz

Maintenant, si vous voulez utiliser C++, vous devrez créer un wrapper, écrit dans un fichier source C++ et compilé avec un compilateur C++, mais avec des fonctions appelables depuis C en utilisant extern "C" . Ces fonctions peuvent ensuite être appelées depuis Swift comme n'importe quelle fonction C. Voir, par exemple, cette réponse :Puis-je mélanger Swift avec C++ ? Comme les fichiers Objective - C .mm


Linux
  1. Linux - Comment vérifier qu'une distribution Linux est sécurisée et n'a pas de code malveillant ??

  2. Afficher le numéro de service DELL et le code de service express sous Linux et Windows

  3. Comment compiler et installer un logiciel à partir du code source sous Linux

  4. Compiler et construire avec une seule ligne de commande Java (Linux)

  5. Utiliser une bibliothèque C dans Swift sous Linux

Comment compiler C, C++ et Java à l'aide de Terminal sous Linux

Comment compiler et exécuter des programmes C, C++ sous Linux

Comment compiler et exécuter un programme C sous Linux

Un gars Windows dans un monde Linux :VS Code et SSH distant

Meilleur éditeur de code Linux :Top 11 examiné et comparé

Comment puis-je générer une couverture de code pour les packages Swift sous Linux ou OS X ?