【问题标题】:How to compile Swift from command line for distribution如何从命令行编译 Swift 以进行分发
【发布时间】:2017-04-18 17:55:34
【问题描述】:

我有一个单一文件的 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 的人时,他们在通过终端运行它时会收到以下错误:

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

我想我需要静态链接一些东西,但我不确定。我无法轻松测试这一点,因为没有 Swift 就无法访问 macOS 构建。

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

【问题讨论】:

  • 你必须链接动态库,而不是静态库。
  • 看来需要导入AppKit
  • 查找链接器命令行选项或将其编译为目标文件-o,然后手动调用链接器。
  • 尝试使用swiftc -static-stdlib
  • 它认为像-F /System/Library/Frameworks -I/usr/include 这样的东西应该可以解决问题。您肯定需要以某种方式指定框架和库的路径。在不了解设置内容的情况下使用命令行可能非常棘手。

标签: swift macos swift3


【解决方案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)
> 

我仍然不知道如何链接 3rd 方框架 - 但上述步骤解决了我原来的问题。

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

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多