Я знаю, как обращаться к библиотекам C в Swift с помощью Xcode в Mac OS, и я знаю о import Glibc
в Linux, но как я могу использовать библиотеку C, такую как OpenGL с Swift в Linux?
Использование библиотеки C в 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.