2017-04-18 8 views
4

私は1つのファイル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

関連する問題