我知道如何在Mac OS上使用Xcode访问Swift中的C库,我知道Linux上的import Glibc
,但是如何在Linux上使用OpenGL和Swift等C库?
答案 0 :(得分:15)
使用系统模块导入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...
答案 1 :(得分:6)
为了继续MBuhot的优秀答案,我这样做是为了在一些Linux系统上运行Swift OpenGL“hello world”,我可以添加更多细节。
在我的情况下,我需要OpenGL和GLUT函数,所以我首先创建了一个COpenGL系统模块。这个模块的源can be found on GitHub,但基本上它是一个包含两个文件的目录:一个空的Package.swift,以及下面的module.modulemap:
module COpenGL [system] {
header "/usr/include/GL/gl.h"
link "GL"
export *
}
请注意标题和链接选项中的大写GL,我需要匹配Mesa的标题和库。
对于GLUT函数,我使用以下module.modulemap创建了一个类似的CFreeGLUT模块(同样,on GitHub):
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", majorVersion: 1),
.Package(url: "https://github.com/BradLarson/CFreeGLUT.git", majorVersion: 1)
]
)
以上内容来自我的系统模块的GitHub版本,但如果您愿意,可以编辑路径以使它们指向本地副本。
我使用红皮书的“hello world”应用程序作为我的基础,在转换为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 = Process.argc
glutInit(&localArgc, Process.unsafeArgv)
glutInitDisplayMode(UInt32(GLUT_SINGLE))
glutInitWindowSize(500,500)
glutInitWindowPosition(100,100)
glutCreateWindow("OpenGL - First window demo")
glutDisplayFunc(renderFunction)
glutMainLoop()
将其放入Sources子目录中的main.swift
文件中。运行swift build
,Swift Package Manager将出去,下载系统模块,构建应用程序,并将模块链接到它。
如果您不想使用Swift Package Manager,您仍然可以从命令行手动使用这些系统模块。为此,请将它们下载到本地目录中,并在编译时显式引用它们:
swiftc -I ./COpenGL -I ./CFreeGLUT main.swift
将读取模块映射,您将能够从Linux上的Swift应用程序中访问OpenGL和GLUT函数。