Swift パッケージ マネージャーを使用して、ビルドに静的C ライブラリを含めたいと考えています。Apple のドキュメントには、共有ライブラリを使用したプロセスが示されていますが、静的を使用する方法があることを願っています。を使用してスタティック ライブラリにリンクできswiftc
ますswift build
。
2 つの数値を乗算する関数を含む静的 C ライブラリを使用する小さな問題の例があります。(注: Linux で Swift 3 Preview 1 を実行しています)
ディレクトリ構造は次のようになります。
example/
Package.swift
main.swift
.git/
CMult/
Package.swift
module.modulemap
mult.h
libmult.a
.git/
example/Package.swift の内容:
import PackageDescription
let package = Package(
name: "example",
dependencies: [
.Package(url: "../CMult", majorVersion: 1)
]
)
example/main.swift の内容:
import CMult
let n: Int32 = mult2(3, 5) // "int mult2(int,int)" is in mult.h and libmult.a
print("Result = \(n)")
CMult/Package.swift の内容:
import PackageDescription
let package = Package(
name: "CMult"
)
CMult/module.modulemap の内容:
module CMult [system] {
header "./mult.h"
link "mult"
export *
}
問題は、実行時にexample$ swift build
リンカーが「/usr/bin/ld: -lmult が見つかりません」というエラーを表示することです。これは、そこになく、他にどこを探すべきかを伝えていないため、驚くべきことではありません。私が望むのは、モジュール マップで -L フラグを指定して、.a ファイルを探す場所を指定する方法です (これは、.a に対して .a をリンクする方法ですswiftc
)。あまり望ましくないが受け入れられる解決策は、LD_LIBRARY_PATH 環境変数を CMult/ を参照するように設定することですが、それでもエラーは変わりませんでした。
何か案は?ありがとう。