我的目标是尝试像脚本一样运行我的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<> .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
但我收到了这个错误:
< unknown>:0:错误:无法加载共享库'libGoodClass'
这是什么意思?我错过了什么如果我继续,并做链接/编译的事情类似于你为C / C ++做的事情:
% xcrun swiftc -o hello -I "./" -L "./" -lGoodClass -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift
% ./hello
然后一切都很开心。我想我可以忍受,但仍然想了解共享库错误。
答案 0 :(得分:5)
这是一个重新格式化的简化bash脚本,用于构建项目。您无需使用-emit-object
和后续转换。您的命令不会导致生成libGoodClass.dylib文件,这是您运行-lGoodClass
时xcrun 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