命令行上的xcrun swift生成<unknown>:0:错误:无法加载共享库</unknown>

时间:2014-09-16 04:05:35

标签: module swift xcrun

我的目标是尝试像脚本一样运行我的Swift程序。如果整个程序是自包含的,您可以像以下一样运行它:

% xcrun swift hello.swift

其中hello.swift是

import Cocoa
println("hello")

但是,我想超越一步,包括swift模块,我可以导入其他类,函数等。

因此,假设我们想要在GoodClass.swift中使用一个非常好的类

public class GoodClass {
    public init() {}
    public func sayHello() {
        println("hello")
    }
}

我现在想把这个好东西导入我的hello.swift:

import Cocoa
import GoodClass

let myGoodClass = GoodClass()
myGoodClass.sayHello()

首先通过运行这些来生成.o,lib&lt;&gt; .a,.swiftmodule:

% xcrun swiftc -emit-library -emit-object GoodClass.swift -sdk $(xcrun --show-sdk-path --sdk macosx) -module-name GoodClass
% ar rcs libGoodClass.a GoodClass.o
% xcrun swiftc -emit-module GoodClass.swift -sdk $(xcrun --show-sdk-path --sdk macosx) -module-name GoodClass

然后最后,我准备运行我的hello.swift(好像它是一个脚本):

% xcrun swift -I "./" -L "./" -lGoodClass -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift 

但我收到了这个错误:

  

&LT; unknown&gt;:0:错误:无法加载共享库'libGoodClass'

这是什么意思?我错过了什么如果我继续,并做链接/编译的事情类似于你为C / C ++做的事情:

% xcrun swiftc -o hello -I "./" -L "./" -lGoodClass -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift
% ./hello

然后一切都很开心。我想我可以忍受,但仍然想了解共享库错误。

1 个答案:

答案 0 :(得分:5)

这是一个重新格式化的简化bash脚本,用于构建项目。您无需使用-emit-object和后续转换。您的命令不会导致生成libGoodClass.dylib文件,这是您运行-lGoodClassxcrun swift -I "./" -L "./" -lGoodClass -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift参数所需的链接器。您也没有指定要与-module-link-name链接的模块。

这对我有用:

#!/bin/bash

xcrun swiftc \
    -emit-library \
    -module-name GoodClass \
    -emit-module GoodClass.swift \
    -sdk $(xcrun --show-sdk-path --sdk macosx)

xcrun swift -I "." -L "." \
    -lGoodClass \
    -module-link-name GoodClass \
    -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift