我想使用 Swift 包管理器在我的构建中包含一个静态C 库。Apple 的文档显示了共享库的过程,但我希望有一种使用静态的方法。我能够使用 链接到静态库swiftc
,因此希望我应该能够使用swift build
.
我有一个小示例问题,它使用一个静态 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: cannot find -lmult”,这并不奇怪,因为它不存在,而且我还没有告诉它去哪里看。我想要的是在模块映射中指定 -L 标志的某种方式,指定在哪里查找 .a 文件(这是我用 .a 链接到我的 .a 的方式swiftc
)。一个不太理想但可接受的解决方案似乎是将 LD_LIBRARY_PATH 环境变量设置为在 CMult/ 中查找,但这并没有改变错误。
有任何想法吗?谢谢。