我只有一个文件Swift命令行脚本(它在给定进程ID的情况下转储了菜单栏的内容)。

为了让我对正在使用的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可执行文件共享给没有Swift的人时,通过Terminal运行该文件时会遇到以下错误:
Code 6: dyld: Library not loaded: @rpath/libswiftAppKit.dylib
  Referenced from: ./menu
  Reason: image not found

我认为我需要静态链接某些东西,但是我不确定。我无法轻松进行测试,因为如果没有Swift,我将无法访问macOS版本。

我将如何使用swiftc来编译脚本,使其可以在任何macOS系统上运行?

最佳答案

对于仅使用-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

关于swift - 如何从命令行编译Swift以进行分发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43479108/

10-12 00:15
查看更多