Verwenden Sie die C-Bibliothek mit Swift unter Verwendung von Clang-Modulen (Modulkarte).

Einführung

Hallo zusammen. Dies ist hiroakit des iOS / tvOS-App-Entwicklers.

In diesem Artikel werde ich Ihnen zeigen, wie Sie eine in C oder C ++ geschriebene Bibliothek mit Swift verwenden.

Die Entwicklungsumgebung, die zum Zeitpunkt des Schreibens dieses Artikels verwendet wurde, ist wie folgt.

$ sw_vers                                                                               
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1114

$ xcrun -find xcode build
/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild

$ xcodebuild -version                                                                   
Xcode 9.2
Build version 9C40b

$ xcrun -find clang
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

$ clang --version
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Motivation

Möglicherweise möchten Sie die C-Bibliothek (z. B. OpenJPEG) als Swift-Framework verwenden.

In diesem Artikel möchte ich zur Erläuterung mit der folgenden C-Bibliothek fortfahren.

- libExample.a
- include/Example.h
- include/ExampleEncoder.h

Angenommen, eine in Swift geschriebene App möchte diese Bibliothek in ein Framework importieren und verwenden.


import UIKit
import Example

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        ExampleEncoder.run(urlString: "https://www.example.com/", profile: "path/to/profile")
    }
}

In diesem Fall müssen Sie beim Umschließen der C-Bibliothek mit Swift in ein Framework eine ".modulemap" -Datei wie unten gezeigt vorbereiten.


framework module Example {
    umbrella header "Example.h"

    export *
    module * { export * }

    header "ExampleEncoder.h"
}

Nachdem Sie dieses Example.framework auf der App-Seite hinzugefügt haben, müssen Sie den Pfad dieses Frameworks zu den folgenden Einstellungselementen des Xcode-Projekts festlegen.

Was ist eine .modulemap-Datei?

Die .modulemap-Datei wird benötigt, um die von der C-Bibliothek verwendete Header-Datei über Clang Modules an Swift zu übermitteln.

Das Folgende zeigt das Format der Datei ".modulemap". Beschreiben Sie die Verwendung von Modulzuordnungssprache.

[explicitopt] [frameworkopt] module module-id attributesopt {
    /* module-member */
}

Beachten Sie, dass die Modulzuordnungssprache nicht garantiert zwischen Hauptversionen von Clang funktioniert. Wenn sich die in Xcode enthaltene Hauptversion von Clang ändert, muss daher überprüft werden, ob das hier beschriebene Verhalten dem vom Entwickler beabsichtigten entspricht.

The module map language is not currently guaranteed to be stable between major revisions of Clang.

Zusammenfassung

Ich habe die Verwendung der C-Bibliothek mit Swift durch Vorbereiten einer Modulzuordnung vorgestellt.

Die Modulkarte funktioniert möglicherweise nicht auf einmal. Seien Sie also vorbereitet und bereiten Sie sie als Set vor.

Ein Beispiel für eine Modulzuordnung ist im Referenzmaterial beschrieben.

Referenzmaterial

Recommended Posts

Verwenden Sie die C-Bibliothek mit Swift unter Verwendung von Clang-Modulen (Modulkarte).
Einführung in Swift / C Bridge mit der Geschichte der Portierung von Echo Server mit libuv
Verwenden von cuda11.0 mit pytorch mit Docker
Ich habe versucht, Realm mit Swift UI zu verwenden
Rufen Sie die Java-Bibliothek von C mit JNI auf
Zeigen Sie Bilder mit AutoLayout-Verhältnis genau mit der Bildladebibliothek Nuke in Swift an