在Linux上使用C库的Swift方法

13

我知道如何在Mac OS上使用Xcode访问C库,以及如何在Linux上使用import Glibc,但是我该如何在Linux上使用像OpenGL这样的C库与Swift一起使用?


https://github.com/sakrist/Swift_OpenGL_Example - Volodymyr B.
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
16

使用系统模块导入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...

7

继MBuhot出色的回答之后,我刚刚在几个Linux系统上进行了以下操作,以运行一个Swift OpenGL“hello world”,我可以提供更多细节。

在我的情况下,我需要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 Manager,则需要在主目录中创建一个类似于以下内容的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系统模块版本中提取,但如果您希望,您可以编辑路径使其指向本地副本。

我以红皮书的“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 = CommandLine.argc
glutInit(&localArgc, CommandLine.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函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,