Использование библиотеки C в Swift на Linux

Я знаю, как обращаться к библиотекам C в Swift с помощью Xcode в Mac OS, и я знаю о import Glibc в Linux, но как я могу использовать библиотеку C, такую ​​как OpenGL с Swift в Linux?

Ответ 1

Используйте системный модуль для импорта файла заголовка OpenGL: https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md

Предполагая, что у вас есть макет каталога, например:

COpenGL/
  Package.swift
  module.modulemap
  .git/

YourApp/
  Package.swift
  main.swift
  .git/

файл COpenGL/module.modulemap будет выглядеть примерно так:

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

Это должно быть создано в отдельном репозитории git с тегом версии:

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

Затем объявите его как зависимость в файле YourApp/Package.swift

import PackageDescription

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

Затем в вашем файле main.swift вы можете импортировать его:

import COpenGL
// use opengl calls here...

Ответ 2

Чтобы ответить на превосходный ответ MBuhot, я просто сделал это, чтобы Swift OpenGL "hello world" работал на нескольких системах Linux, и я могу добавить немного больше деталей.

В моем случае мне понадобились функции как OpenGL, так и GLUT, поэтому я сначала создал системный модуль COpenGL. Исходный код этого модуля можно найти на GitHub, но в основном это каталог с двумя файлами: пустой Package.swift и следующий файл module.modulemap:

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

Обратите внимание на заглавную GL в опциях заголовка и ссылок, которые мне нужны для соответствия заголовкам и библиотекам Mesa.

Для функций GLUT я создал аналогичный модуль CFreeGLUT (опять же, на GitHub) со следующим модулем module.modulemap:

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

Для приложения, если вы хотите использовать диспетчер пакетов Swift, вам нужно создать Package.swift в главном каталоге, который выглядит следующим образом:

import PackageDescription

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

Вышеприведенное извлекает из моих версий системных модулей GitHub, но вы можете отредактировать пути, чтобы они указывали на локальные копии, если хотите.

В качестве основы я использовал приложение "Красная книга" из Красной книги, которое при преобразовании в Swift выглядит следующим образом:

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 = CommandLine.argc
glutInit(&localArgc, CommandLine.unsafeArgv)
glutInitDisplayMode(UInt32(GLUT_SINGLE))
glutInitWindowSize(500,500)
glutInitWindowPosition(100,100)
glutCreateWindow("OpenGL - First window demo")
glutDisplayFunc(renderFunction)
glutMainLoop()

Поместите это в файл main.swift в подкаталоге Sources. Запустите swift build, и менеджер пакетов Swift выйдет, загрузит системные модули, создаст приложение и свяжет модули с ним.

Если вы не хотите использовать Swift Package Manager, вы все равно можете вручную использовать эти системные модули из командной строки. Для этого загрузите их в локальный каталог и явно указывайте их при компиляции:

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

Карты модулей будут прочитаны, и вы сможете получить доступ к функциям OpenGL и GLUT из вашего приложения Swift в Linux.