当前位置:  开发笔记 > 编程语言 > 正文

在Linux上使用Swift中的C库

如何解决《在Linux上使用Swift中的C库》经验,为你挑选了2个好方法。

我知道如何在Mac OS上使用Xcode访问Swift中的C库,我import Glibc在Linux上知道,但是如何在Linux上使用OpenGL和Swift等C库?



1> Mike Buhot..:

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

为了继续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函数,我使用以下module.modulemap 创建了一个类似的CFreeGLUT模块(同样在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", 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()

将其放入main.swiftSources子目录中的文件中.运行swift build和Swift包管理器将出去,下载系统模块,构建应用程序,并将模块链接到它.

如果您不想使用Swift Package Manager,您仍然可以从命令行手动使用这些系统模块.为此,请将它们下载到本地目录中,并在编译时显式引用它们:

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

将读取模块映射,您将能够从Linux上的Swift应用程序中访问OpenGL和GLUT函数.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有