将静态 C 库与 Swift 包管理器一起使用

Use static C library with Swift package manager

我想使用 Swift 包管理器在我的构建中包含一个 static C 库。 Apple's documentation 显示了共享库的过程,但我希望有一种使用静态的方法。我能够 link 使用 swiftc 来对抗静态库,因此希望我应该能够使用 swift build.

来做到这一点似乎是合理的

我有一个小示例问题,它使用静态 C 库,其中包含一个将两个数字相乘的函数。 (注意:我在 运行ning Swift 3 Preview 1 on Linux)

看起来像这样的目录结构:

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 时,link 用户抱怨错误,“/usr/bin/ld: 找不到 -lmult”,这不是不足为奇,因为它不在那里,我也没有告诉它去哪里找。我想要的是一些在模块映射中指定 -L 标志的方法,指定在哪里寻找 .a 文件(这就是我 link 对我的 .a 使用 swiftc 的方式) .一个不太理想但可以接受的解决方案似乎是将 LD_LIBRARY_PATH 环境变量设置为在 CMult/ 中查找,但这并没有改变错误。

有什么想法吗?谢谢。

我不知道在模块映射中指定库位置的方法,但这是对我有用的方法:

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

您可以通过 运行

找到一些其他有用的选项
swift build --help

至于LD_LIBRARY_PATH,那是为了搜索共享库。对于静态,它将是 LIBRARY_PATH,但当我尝试时,它不适用于 swift build。不过,它确实适用于 gcc