9

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/ を参照するように設定することですが、それでもエラーは変わりませんでした。

何か案は?ありがとう。

4

1 に答える 1

6

モジュール マップでライブラリの場所を指定する方法はわかりませんが、次の方法でうまくいきました。

example$ swift build -Xlinker -L../CMult

実行すると、他の便利なオプションを見つけることができます

swift build --help

に関してはLD_LIBRARY_PATH、共有ライブラリを検索するためのものです。static の場合は になりますがLIBRARY_PATH、試してみるとうまくいきませんでしswift buildた。しかし、それは動作しgccます。

于 2016-08-07T23:44:28.120 に答える