GNU/Linux >> Tutoriales Linux >  >> Linux

Compile el código C y expóngalo a Swift bajo Linux

El uso de funciones de C en Swift requiere un encabezado puente que incluya toda la funcionalidad de C que necesita. Por ejemplo, myBridgingHeader.h que contiene #include "Car.h" y cualquier otra cosa de C que desee. Creo que C ++ actualmente no es compatible.

Una vez que tenga el encabezado de puente, debe informarlo rápidamente. Los usuarios de Xcode obtienen esto gratis cuando lo agregan al proyecto. En Linux, use el indicador '-import-objc-header /path/to/header' al compilar.

Editar:he agregado un ejemplo completo a continuación que consta de 6 archivos para cualquier otra persona que pueda tener esta pregunta. Es básicamente lo mismo que el de arriba, pero no lo vi hasta que ya lo armé, jaja. Además, puede ser útil para alguien que necesita vincular bibliotecas estáticas.

Copie el contenido del archivo a continuación en archivos con el nombre apropiado, make , luego ./hello y eso debería funcionar. Para que conste, solo ejecuté esto en la versión Swift 2.2-dev (use swift --version para comprobar el tuyo)

  • hola.swift:

    let n: Int32 = 5
    print("Hello, Swift World!")
    print("mult2(\(n,N)) = \(mult2(n,N))")
    print("CONST1=\(CONST1), CONST2=\(CONST2), CONST3=\(CONST3)")
    
  • puente.h:

    #include "defs.h"
    #include "mult.h"
    
  • def.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 crea una biblioteca a partir de su código C, puede crear un módulo de sistema para ello, que luego se puede importar a Swift, vea esta respuesta:Use una biblioteca C en Swift en Linux.

Otra forma de abordar esta tarea es crear un encabezado puente, como lo sugiere @Philip. Aquí hay un ejemplo simplificado. Consideremos el siguiente código C:

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

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

Usaremos car.h como encabezado puente. La fuente rápida es (en el archivo junk.swift ):

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

Primero, cree un archivo de objeto, car.o , desde car.c :

gcc -c car.c

Ahora construye un ejecutable, junk , de la siguiente manera:

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

Ejecutar el ejecutable da:

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

El -import-objc-header la opción está oculta. Para verlo y un montón de otras opciones ocultas, ejecute:

swiftc -help-hidden 

Hice esto usando la instantánea de desarrollo de Swift 3.0 para Ubuntu 14.04 del 12 de abril, disponible aquí:https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- INSTANTÁNEA-2016-04-12-a-ubuntu14.04.tar.gz

Ahora, si desea usar C++, deberá crear un contenedor, escrito en un archivo fuente de C++ y compilado con un compilador de C++, pero con funciones que se pueden llamar desde C usando extern "C" . Esas funciones se pueden llamar desde Swift como cualquier función de C. Vea, por ejemplo, esta respuesta:¿Puedo mezclar Swift con C++? Como los archivos Objective - C .mm


Linux
  1. Linux:¿cómo verificar que una distribución de Linux sea segura y no tenga código malicioso?

  2. Cómo compilar e instalar software desde el código fuente en Linux

  3. ¿Cómo desensamblar, modificar y luego volver a ensamblar un ejecutable de Linux?

  4. Use una biblioteca C en Swift en Linux

  5. Cómo compilar código de Windows Visual C++ en Linux

Cómo compilar C, C++ y Java usando Terminal en Linux

Cómo compilar y ejecutar programas C, C++ en Linux

Cómo compilar y ejecutar un programa C en Linux

Un chico de Windows en un mundo Linux:VS Code y SSH remoto

Mejor editor de código de Linux:Top 11 revisado y comparado

¿Cómo puedo generar cobertura de código para paquetes Swift en Linux u OS X?