我在Linux上編寫一些入門級的swift代碼作爲學習練習。Linux上的Swift - 導入第三方模塊
作爲一項常規任務,我希望在自己的代碼中使用第三方Swift模塊。我們稱這個模塊爲「Foo」。 Foo模塊有一個Package.swift文件,在該目錄中運行swift build
後,它創建了.build/debug/libFoo.so
。
現在我希望做兩件事情是:
- 能夠
import Foo
在REPL。 - 能夠在我自己的swift程序中導入Foo,也許通過鏈接這個共享對象。
我有一種感覺兩個任務是相關的,所以現在他們在同一個問題。
對於1.,我不明白包是怎麼被REPL'找到'的。我試過swift -F .build/debug -framework Foo
但我得到了「沒有這樣的模塊」的錯誤。我也試過swift -I .build/debug
,結果相同。
對於2,我檢查swiftc --help
並有-L
和-l
可選項,但我沒能找到使用這些正確的方式:
$ swiftc main.swift -L ../foo.git/.build/debug -llibFoo.so
main.swift:1:8: error: no such module 'Foo'
import Foo
^
我同時使用/無論是斯威夫特2.2或3.0 (對於2.2使用swim
而不是swift build
,因爲沒有swift build
- 但它產生的輸出相同)。
請注意,據我所知,swift build
可以自動下載並構建第三方模塊,但我想知道如何合併磁盤模塊,因爲它們可能是我自己的工作正在進行的模塊。
編輯:我試着用swift3一個小實驗基礎上發現,你可以使用本地路徑,在包的dependencies:
列表中url:
參數,至少在當地的發展。
我創建的目錄Bar
和Bar/Package.swift
:
import PackageDescription
let package = Package(name: "Bar")
我還創建Bar/Sources/bar.swift
含有:
public func bar(arg: Int) -> Int {
return arg * 2
}
的意圖是,模塊Bar
提供稱爲bar(arg:)
的功能。
我做了git init
,git add .
,git commit -m "Initial commit."
然後git tag 1.0.0
創建此模塊標記本地混帳回購協議。
然後回到在頂層我創建目錄Foo
和Foo/Package.swift
:
import PackageDescription
let package = Package(
name: "Foo",
dependencies: [ .Package(url: "../Bar", majorVersion: 1) ]
)
注爲../Bar
的相對路徑。
我還創建Foo/Sources/main.swift
:
import Bar
print(bar(arg: 11))
現在,當我swift build
裏面Foo
,它克隆Bar
,並建立它。但是,然後我得到以下錯誤; 沒有這樣的模塊:
$ swift build
Compile Swift Module 'Bar' (1 sources)
Compile Swift Module 'Foo' (1 sources)
.../Foo/Sources/main.swift:1:8: error: no such module 'Bar'
import Bar
^
<unknown>:0: error: build had 1 command failures
error: exit(1): .../swift-3.0-PREVIEW-4-ubuntu14.04/usr/bin/swift-build-tool -f .../Foo/.build/debug.yaml
奇怪的是,如果我再次做同樣的build命令,我得到一個不同的錯誤:
$ swift build
Compile Swift Module 'Foo' (1 sources)
Linking .build/debug/Bar
.../Foo/Sources/main.swift:3:7: error: use of unresolved identifier 'bar'
print(bar(arg: 11))
^~~
<unknown>:0: error: build had 1 command failures
error: exit(1): .../swift-3.0-PREVIEW-4-ubuntu14.04/usr/bin/swift-build-tool -f .../Foo/.build/debug.yaml
我希望這會工作。
我無法重現您最近一次嘗試的問題:我按照您所描述的步驟和'Foo'成功導入了'Bar'並稱爲'bar'函數。另一個問題:你是如何設法建立一個產生'libFoo.so'庫的模塊?當我從你最新的例子中構建'Bar'模塊時,在'.build/debug'中沒有'libBar.so' – OmniProg
@OmniProg感謝你試用它。我不確定它爲什麼對你有用。我會嘗試使用不同版本的Swift。令人鼓舞的是,它確實對你有用。關於第二點,在我創建Foo/Bar示例之前,我使用了一個不叫'Bar'(它被稱爲Swifter)的第三方模塊,它確實生成了libSwifter.so文件,但我想要把這個問題作爲一個普遍問題來提出。我假定.so是標準輸出,但顯然不是。我沒有看到Swifter中的任何東西可以解釋爲什麼它會生成一個.so。 – meowsqueak
對不起,忘了提及我使用的是完全相同的版本,swift-3.0-PREVIEW-4-ubuntu14.04,所以可能值得清理所有派生文件並重新嘗試。 – OmniProg