私は学習の練習として、Linuxにいくつかのエントリーレベルのスウィフトコードを書いています。Linux上でSwift - サードパーティのモジュールをインポートする
一般的な作業として、自分のコードでサードパーティのSwiftモジュールを使用したいと考えています。このモジュールを "Foo"と呼ぶことにしましょう。 FooモジュールにはPackage.swiftファイルがあり、そのディレクトリにswift build
を実行すると、.build/debug/libFoo.so
が作成されています。
は今、私はこれで2つのことを行うことを望む:
- はREPLで
import Foo
することができます。 - おそらくこの共有オブジェクトにリンクすることで、私自身の迅速なプログラムでFooをインポートすることができます。
私は両方のタスクが関連していると感じているので、今のところ同じ質問になります。
については、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を使用しています(swift build
ではなくswim
を2.2として使用していますが、それはswift build
ではありませんが、私はそれと同じ出力を生成します)。
swift build
は自動的にサードパーティのモジュールをダウンロードしてビルドすることができますが、オンディスクモジュールを自分自身の作業中のモジュールとして組み込む方法を知りたいと思います。
編集:私はあなたが、少なくとも地域開発のために、パッケージのdependencies:
リストにurl:
パラメータとしてローカルパスを使用することができるという発見に基づいてswift3と少し実験を試みました。
私は、ディレクトリ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のレポを作成するgit init
、git add .
、git commit -m "Initial commit."
、その後git tag 1.0.0
をしました。
import PackageDescription
let package = Package(
name: "Foo",
dependencies: [ .Package(url: "../Bar", majorVersion: 1) ]
)
注../Bar
の相対パス:
はその後戻って、トップレベルの私は、ディレクトリFoo
とFoo/Package.swift
を作成しました。
私もFoo/Sources/main.swift
を作成しました:
import Bar
print(bar(arg: 11))
今Foo
内部swift build
、それはBar
のクローンとそれを構築する場合。しかし、私は次のエラーを取得します。 そのようなモジュール:私は、これはうまくいくかもしれないことを期待していた
$ 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
:私はもう一度まったく同じビルドコマンドを実行する場合
$ 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
奇妙なことに、私は別のエラーを取得していません。
最新の試みで問題を再現できませんでした。私が説明した手順に従って、 'Foo'が' Bar'を読み込み、 'bar'関数を呼び出しました。もう1つの質問: 'libFoo.so'ライブラリを作成したモジュールをどうやってビルドしましたか?あなたの最新の例から 'Bar'モジュールをビルドしたとき、' .build/debug'に 'libBar.so'がありませんでした。 – OmniProg
@OmniProg試してみてください。なぜそれがあなたのために働いたのか分かりません。私はSwiftの別のバージョンで試してみます。それはあなたのために働くことを奨励しています。あなたの2番目のポイントは、私がFoo/Barの例を作る前に、私はBarと呼ばれていないサードパーティのモジュール(Swifterと呼ばれていた)を使って作業していましたが、libSwifter.soファイルを生成しました。質問を一般的なものとして提起する。私は.soが標準出力であると仮定しましたが、明らかにそうではありません。私はSwifterの中に何が出ているのか分からない。 – meowsqueak
申し訳ありませんが、正確に同じバージョンのswift-3.0-PREVIEW-4-ubuntu14.04を使用していることを忘れてしまったので、すべての派生ファイルをクリーンアップしてゼロから再試行する価値があります。 – OmniProg