2015-12-07 20 views
11

Tôi biết cách truy cập thư viện C trong Swift bằng Xcode trên Mac OS và tôi biết về import Glibc trên Linux, nhưng làm cách nào tôi có thể sử dụng thư viện C như OpenGL với Swift trên Linux?Sử dụng thư viện C trong Swift trên Linux

+0

Không trả lời, nhưng ví dụ điển hình https://github.com/sakrist/Swift_OpenGL_Example – SAKrisT

Trả lời

15

Sử dụng một mô-đun hệ thống để nhập khẩu các tập tin tiêu đề OpenGL: https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md

Giả sử bạn có một bố trí thư mục như:

COpenGL/ 
    Package.swift 
    module.modulemap 
    .git/ 

YourApp/ 
    Package.swift 
    main.swift 
    .git/ 

các COpenGL tập tin/module.modulemap sẽ giống như thế:

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

Điều này phải được tạo trong một repo git riêng biệt, với thẻ phiên bản:

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

Sau đó, tuyên bố nó như là một sự phụ thuộc vào yourapp/Package.swift nộp

import PackageDescription 

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

Sau đó, trong tập tin main.swift của bạn, bạn có thể nhập nó:

import COpenGL 
// use opengl calls here... 
6

Để theo dõi luôn của MBuhot Câu trả lời tuyệt vời, tôi chỉ làm điều này để có được một Swift OpenGL "hello world" chạy trên một vài hệ thống Linux và tôi có thể thêm chi tiết hơn một chút.

Trong trường hợp của tôi, tôi cần cả OpenGL và các chức năng GLUT, vì vậy lần đầu tiên tôi tạo ra một mô-đun hệ thống COpenGL. Nguồn tin cho module này can be found on GitHub, nhưng về cơ bản nó là một thư mục với hai tập tin: một Package.swift trống rỗng, và module.modulemap sau:

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

Lưu ý GL vốn trong các tùy chọn tiêu đề và liên kết, mà tôi cần để phù hợp với tiêu đề và thư viện của Mesa.

Đối với các chức năng thị trường bất động, tôi đã tạo ra một mô-đun tương tự CFreeGLUT (một lần nữa, on GitHub) với module.modulemap sau:

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

Đối với các ứng dụng, nếu bạn muốn sử dụng Quản lý Swift Package, bạn' sẽ cần phải tạo ra một Package.swift trong thư mục chính mà trông như thế này:

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) 
    ] 
) 

các Kéo trên từ phiên bản GitHub của tôi về các module hệ thống, nhưng bạn có thể chỉnh sửa các đường dẫn có họ trỏ đến các bản sao địa phương, nếu bạn muốn.

tôi đã sử dụng ứng dụng "hello world" Sách của Red làm cơ sở của tôi, trông giống như sau khi chuyển đổi sang 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() 

Nơi đó vào một tập tin main.swift trong thư mục con Sources. Chạy swift build và Trình quản lý gói Swift sẽ đi ra ngoài, tải xuống các mô-đun hệ thống, xây dựng ứng dụng và liên kết các mô-đun với nó.

Nếu bạn không muốn sử dụng Trình quản lý gói Swift, bạn vẫn có thể sử dụng thủ công các mô-đun hệ thống này từ dòng lệnh.Để làm như vậy, tải chúng vào một thư mục địa phương và dứt khoát tham khảo chúng khi biên dịch:

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

Các bản đồ mô-đun sẽ được đọc và bạn sẽ có thể truy cập OpenGL và các chức năng thị trường bất động từ bên trong ứng dụng Swift của bạn trên Linux .

Các vấn đề liên quan