Utiliser la bibliothèque C avec Swift en utilisant les modules Clang (modulemap)

introduction

Bonjour à tous. Il s'agit de hiroakit du développeur d'applications iOS / tvOS.

Dans cet article, je vais vous montrer comment utiliser une bibliothèque écrite en C ou C ++ avec Swift.

L'environnement de développement utilisé au moment de la rédaction de cet article est le suivant.

$ 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

Vous pouvez utiliser la bibliothèque C (par exemple, OpenJPEG) comme framework Swift.

Dans cet article, je voudrais continuer avec la bibliothèque C suivante pour l'explication.

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

Supposons qu'une application écrite en Swift veuille importer et utiliser cette bibliothèque dans un framework.


import UIKit
import Example

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

Dans ce cas, lorsque vous encapsulez la bibliothèque C avec Swift dans un framework, vous devez préparer un fichier .modulemap comme indiqué ci-dessous.


framework module Example {
    umbrella header "Example.h"

    export *
    module * { export * }

    header "ExampleEncoder.h"
}

Après avoir ajouté ce Example.framework du côté de l'application, vous devez définir le chemin de ce framework vers les éléments de configuration suivants du projet Xcode.

Qu'est-ce qu'un fichier .modulemap?

Le fichier .modulemap est nécessaire pour transmettre le fichier d'en-tête utilisé par la bibliothèque C à Swift via Clang Modules.

Ce qui suit montre le format du fichier .modulemap. Décrivez à l'aide du module map language.

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

Notez que le langage de la carte du module n'est pas garanti de fonctionner entre les versions principales de Clang. Par conséquent, si la version principale de Clang incluse dans Xcode change, il est nécessaire de vérifier si le comportement ici est celui prévu par le développeur.

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

Résumé

J'ai présenté comment utiliser la bibliothèque C avec Swift en préparant une carte de module.

Le modulemap peut ne pas fonctionner d'un seul coup, alors soyez prêt et préparez-le comme un ensemble.

Un exemple de carte de module est décrit dans le matériel de référence.

Matériel de référence

Recommended Posts

Utiliser la bibliothèque C avec Swift en utilisant les modules Clang (modulemap)
Présentation de Swift / C Bridge avec l'histoire du portage d'Echo Server à l'aide de libuv
Utilisation de cuda11.0 avec pytorch en utilisant Docker
J'ai essayé d'utiliser Realm avec Swift UI
Appeler la bibliothèque Java à partir de C avec JNI
Afficher les images avec le rapport de mise en page automatique exactement en utilisant la bibliothèque de chargement d'images Nuke dans Swift