Versuchen Sie, mehr C-Sprache und Swift in einem Projekt (OS X, Linux) zu mischen.

Überblick

einpacken

  1. Swift unterdrückt das Verstümmeln
  2. Rufen Sie Swifts verstümmelte Funktion von C aus auf

[^ Zusammenfassung-1]: ABI ist ab Swift 3.0 stabil ... Es sollte weiter verschoben werden [^ Zusammenfassung-1-Anmerkung-1]. [^ Summary-1-Note-1]: Beenden der Swift 3-Version

Umgebung

Genauso wie letztes Mal.

OS X


$ clang --version
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ swift --version
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
Target: x86_64-apple-macosx10.9

Linux


$ clang --version
clang version 3.8.0 (tags/RELEASE_380/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin

$ swift --version
Swift version 2.2.1 (swift-2.2.1-RELEASE)
Target: x86_64-unknown-linux-gnu

Quelldatei

Diesmal habe ich 4 Dateien vorbereitet.

$ ls
c.c  c.h  swift.h  swift.swift

c.h


#include <stdio.h>
void c_function(const char *string);
void call_swift_function(void);

swift.h


void swift_function(const char *string);

c.c


#include "c.h"
#include "swift.h"
void c_function(const char *string) {
  printf("%s", string);
}
void call_swift_function(void) {
  swift_function("Hello, I'm C.\n");
}

swift.swift


@_silgen_name("swift_function")
func swift_function(cString:UnsafePointer<CChar>) {
  print(String.fromCString(cString)!) 
}
c_function("Hello, I'm Swift.\n")
call_swift_function()

Kompilierungsverfahren

Erstellen Sie eine Objektdatei aus einer C-Sprachquelle

OS&#x0020;X,&#x0020;Gemeinsam für Linux


$ clang -c c.c -oc.o
$ ls
c.c  c.h  c.o  swift.h  swift.swift

Kompilieren Sie die Swift-Quelle mit der Objektdatei

OS&#x0020;X


$ xcrun --sdk macosx swiftc swift.swift c.o -import-objc-header c.h
ld: warning: object file (c.o) was built for newer OSX version (10.11) than being linked (10.9)
$ ls
c.c		c.h		c.o		main		swift.h		swift.swift
$ ./main
Hello, I'm Swift.
Hello, I'm C.

Linux


$ swiftc swift.swift c.o -import-objc-header c.h
$ ls
c.c  c.h  c.o  main  swift.h  swift.swift
$ ./main
Hello, I'm Swift.
Hello, I'm C.

erledigt. Das ist das Ende. Es ist einfach, oder?

Apropos

Es gibt eine Möglichkeit, einen Funktionszeiger zu übergeben, aber das ist eine andere Geschichte [http://qiita.com/YOCKOW/items/9239e65995b8c4f8b14f].

Recommended Posts

Versuchen Sie, mehr C-Sprache und Swift in einem Projekt (OS X, Linux) zu mischen.
Versuchen Sie, C-Sprache und Swift in einem Projekt (OS X, Linux) zu mischen.
Organisieren Sie Builds in C ++ / Java- und Win / Linux-Kombinationen
Probieren Sie gRPC im Spring Boot & Spring Cloud-Projekt (Mac OS) aus.