2017-04-18 106 views
4

我有一個Swift命令行腳本文件(它轉儲給定進程ID的菜單欄的內容)。如何從命令行編譯Swift進行分發

爲了讓我使用的API的想法,這裏有一些相關的線路:

import Foundation 
import Cocoa 

// ... 
func getAttribute(element: AXUIElement, name: String) -> CFTypeRef? { 
    var value: CFTypeRef? = nil 
    AXUIElementCopyAttributeValue(element, name as CFString, &value) 
    return value 
} 

// ... 
var app: NSRunningApplication? = nil 
if pid == -1 { 
    app = NSWorkspace.shared().menuBarOwningApplication 
} 
else { 
    app = NSRunningApplication(processIdentifier: pid) 
} 

// ... 
let axApp = AXUIElementCreateApplication(app.processIdentifier) 

整個文件可用here

當我編譯這個使用swiftc menu.swift,我可以在我的系統中運行它已經安裝了Swift。

當我分享menu可執行文件給別人誰不有雨燕,它們會通過終端運行以下錯誤,當它:

Code 6: dyld: Library not loaded: @rpath/libswiftAppKit.dylib 
    Referenced from: ./menu 
    Reason: image not found 

我想我需要靜態鏈接一些東西,但我不知道。我無法輕鬆測試,因爲我沒有訪問沒有Swift的macOS版本。

我該如何使用swiftc這樣我就可以編譯我的腳本,使它可以在任何macOS系統上運行?

+0

您必須鏈接動態庫,而不是靜態庫。 – Sulthan

+0

您似乎需要導入'AppKit' – vadian

+0

查找鏈接器命令行選項或將其編譯爲目標文件「-o」,然後手動調用鏈接器。 – Sulthan

回答

1

對於僅使用標準庫使用-static-stdlib的情況,您可以解決此問題。

當您編譯沒有選項的腳本時,最終的可執行文件包含各種Swift標準庫的rpath,您可以使用otool進行驗證。

> swiftc menu.swift 
> otool -L menu 
menu: 
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1348.28.0) 
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) 
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1504.75.0) 
    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 48.0.0) 
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1349.25.0) 
    @rpath/libswiftAppKit.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftCoreData.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftCoreGraphics.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftCoreImage.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftDarwin.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftDispatch.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftFoundation.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftIOKit.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftQuartzCore.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftSwiftOnoneSupport.dylib (compatibility version 1.0.0, current version 800.0.63) 
    @rpath/libswiftXPC.dylib (compatibility version 1.0.0, current version 800.0.63)  

使用-static-stdlib確保標準庫鏈接到所需的。

> swiftc -static-stdlib menu.swift 
> otool -L menu 
menu: 
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1348.28.0) 
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) 
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0) 
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1349.25.0) 
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1504.75.0) 
    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 48.0.0) 
    /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData (compatibility version 1.0.0, current version 752.8.0) 
    /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics (compatibility version 64.0.0, current version 1070.13.0) 
> 

我仍然不知道如何鏈接第三方框架 - 但上述步驟解決了我原來的問題。

Related Linux Question - Compile Swift script with static Swift core library