2015-12-07 18 views
11

Ich weiß, wie auf C-Bibliotheken in Swift mit Xcode auf Mac OS zugreifen, und ich weiß über import Glibc unter Linux, aber wie kann ich eine C-Bibliothek wie OpenGL mit Swift unter Linux verwenden?Verwenden Sie eine C-Bibliothek in Swift unter Linux

+0

Keine Antwort, aber gutes Beispiel https://github.com/sakrist/Swift_OpenGL_Example – SAKrisT

Antwort

15

ein System-Modul Verwenden Sie die OpenGL-Header-Datei zu importieren: https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md

Vorausgesetzt Sie haben eine Verzeichnisstruktur haben wie:

COpenGL/ 
    Package.swift 
    module.modulemap 
    .git/ 

YourApp/ 
    Package.swift 
    main.swift 
    .git/ 

die COpenGL/module.modulemap Datei etwas aussehen wird:

module COpenGL [system] { 
    header "/usr/include/gl/gl.h" 
    link "gl" 
    export * 
} 

Dies muss in einem separaten Git Repo mit einem Versionstag erstellt werden:

touch Package.swift 
git init 
git add . 
git commit -m "Initial Commit" 
git tag 1.0.0 

Dann erklären sie als Abhängigkeit in YourApp/Package.swift Datei

import PackageDescription 

let package = Package(
    dependencies: [ 
     .Package(url: "../COpenGL", majorVersion: 1) 
    ] 
) 

Dann in Ihrem main.swift Datei können Sie es importieren:

import COpenGL 
// use opengl calls here... 
6

Um zu MBuhot die folgen auf ausgezeichnete Antwort, ich habe dies getan, um eine Swift OpenGL "Hallo Welt" auf ein paar Linux-Systemen laufen zu lassen und ich kann ein wenig mehr Details hinzufügen.

In meinem Fall brauchte ich sowohl OpenGL und die GLUT-Funktionen, also habe ich zuerst ein COpenGL-System-Modul erstellt. Die Quelle für dieses Modul can be found on GitHub, aber im Grunde ist es ein Verzeichnis mit zwei Dateien: eine leere Package.swift und die folgende module.modulemap:

module COpenGL [system] { 
    header "/usr/include/GL/gl.h" 
    link "GL" 
    export * 
} 

Notiere die Hauptstadt GL in den Kopf- und Verknüpfungsoptionen, die ich brauchte, um die Header und Bibliotheken von Mesa zu vergleichen.

Für die GLUT Funktionen, ich ein ähnliches CFreeGLUT Modul erstellt (wieder on GitHub) mit folgendem module.modulemap:

module CFreeGLUT [system] { 
    header "/usr/include/GL/freeglut.h" 
    link "glut" 
    export * 
} 

Für die Anwendung, wenn Sie die Swift Package Manager verwenden möchten, ‚Sie ll braucht eine Package.swift im Hauptverzeichnis zu erstellen, die wie folgt aussehen:

import PackageDescription 

let package = Package(
    dependencies: [ 
     .Package(url: "https://github.com/BradLarson/COpenGL.git", majorVersion: 1), 
     .Package(url: "https://github.com/BradLarson/CFreeGLUT.git", majorVersion: 1) 
    ] 
) 

die oben zieht aus meiner GitHub Version der Systemmodule, aber Sie können die Pfade bearbeiten, um sie an den lokalen Kopien verweisen zu haben, wenn du willst.

ich verwenden, um den Red Book „Hallo Welt“ -Anwendung als meine Basis, die wie folgt aussieht, wenn Swift konvertierte:

import COpenGL 
import CFreeGLUT 

func renderFunction() { 
    glClearColor(0.0, 0.0, 0.0, 0.0) 
    glClear(UInt32(GL_COLOR_BUFFER_BIT)) 
    glColor3f(1.0, 0.0, 0.0) 
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0) 
    glBegin(UInt32(GL_POLYGON)) 
     glVertex2f(-0.5, -0.5) 
     glVertex2f(-0.5, 0.5) 
     glVertex2f(0.5, 0.5) 
     glVertex2f(0.5, -0.5) 
    glEnd() 
    glFlush() 
} 

var localArgc = Process.argc 
glutInit(&localArgc, Process.unsafeArgv) 
glutInitDisplayMode(UInt32(GLUT_SINGLE)) 
glutInitWindowSize(500,500) 
glutInitWindowPosition(100,100) 
glutCreateWindow("OpenGL - First window demo") 
glutDisplayFunc(renderFunction) 
glutMainLoop() 

Ort, der in eine main.swift Datei innerhalb des Quellen-Unterverzeichnisses. Führen Sie swift build aus und der Swift Package Manager wird ausgehen, die Systemmodule herunterladen, die Anwendung erstellen und die Module dagegen verknüpfen.

Wenn Sie den Swift Package Manager nicht verwenden möchten, können Sie diese Systemmodule weiterhin manuell über die Befehlszeile verwenden.Dazu laden Sie sie in ein lokales Verzeichnis und explizit Referenz beim Kompilieren:

swiftc -I ./COpenGL -I ./CFreeGLUT main.swift 

Die Modul Karten werden gelesen, und Sie werden in der Lage OpenGL zugreifen und die GLUT-Funktionen aus Ihrer Swift-Anwendung auf Linux .