GNU/Linux >> Znalost Linux >  >> Linux

Zkompilujte kód C a vystavte jej Swift pod Linuxem

Použití funkcí C ve swift vyžaduje překlenovací záhlaví, které obsahuje všechny funkce C, které potřebujete. Například myBridgingHeader.h, který obsahuje #include "Car.h" a cokoli jiného C, co chcete. Domnívám se, že C++ není v současné době podporován.

Jakmile budete mít překlenovací záhlaví, musíte na to rychle upozornit. Uživatelé Xcode to získají zdarma, když to přidají do projektu. V Linuxu použijte při kompilaci příznak '-import-objc-header /path/to/header'.

Edit:Níže jsem přidal kompletní příklad sestávající ze 6 souborů pro všechny ostatní, kteří mohou mít tuto otázku. Je to v podstatě stejné jako to výše, ale neviděl jsem to, dokud jsem to nedal dohromady haha. Také to může být užitečné pro někoho, kdo potřebuje propojit statické knihovny.

Zkopírujte obsah souboru níže do vhodně pojmenovaných souborů make a poté ./hello a to by mělo fungovat. Pro pořádek, spustil jsem to pouze na swift verzi 2.2-dev (použijte swift --version zkontrolovat ten váš)

  • hello.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
    

Pokud z kódu C vytvoříte knihovnu, můžete vytvořit systémový modul pro to, které lze poté importovat do Swiftu, viz tato odpověď:Použijte knihovnu C ve Swiftu na Linuxu.

Dalším způsobem, jak k tomuto úkolu přistoupit, je vytvořit překlenovací hlavičku, jak navrhuje @Philip. Zde je příliš zjednodušený příklad. Podívejme se na následující kód C:

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

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

Jako přemosťovací hlavičku použijeme car.h. Swift zdroj je (v souboru junk.swift ):

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

Nejprve vytvořte objektový soubor car.o , z car.c :

gcc -c car.c

Nyní vytvořte spustitelný soubor junk , takto:

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

Spuštění spustitelného souboru dává:

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

-import-objc-header možnost je skrytá. Chcete-li jej zobrazit a spoustu dalších skrytých možností, spusťte:

swiftc -help-hidden 

Udělal jsem to pomocí snímku vývoje Swift 3.0 pro Ubuntu 14.04 z 12. dubna, který je k dispozici zde:https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- SNAPSHOT-2016-04-12-a-ubuntu14.04.tar.gz

Nyní, pokud chcete používat C++, budete muset vytvořit obal, napsaný ve zdrojovém souboru C++ a zkompilovaný pomocí kompilátoru C++, ale s funkcemi volatelnými z C pomocí extern "C" . Tyto funkce lze poté volat ze Swift jako jakoukoli funkci C. Viz například tato odpověď:Mohu smíchat Swift s C++? Stejně jako Objective - C .mm soubory


Linux
  1. Linux – Jak zkontrolovat, zda je linuxová distribuce bezpečná a neobsahuje škodlivý kód?

  2. Zobrazit servisní štítek DELL a kód expresní služby z Linuxu a Windows

  3. Vytváření a odstraňování souborů a adresářů pod Linuxem

  1. Jak tarovat, rozbalovat soubory a prohlížet obsah souboru tar pod Linuxem

  2. Použijte knihovnu C ve Swift na Linuxu

  3. Jak zkompilovat kód Windows Visual C++ na Linuxu

  1. Jak rozebrat, upravit a poté znovu sestavit spustitelný soubor Linuxu?

  2. Jak vytvořit řešení Visual Studio pod Linuxem?

  3. Jak udržet spustitelný kód v paměti i pod tlakem paměti? v Linuxu