在Swift软件包管理器中使用静态C库
问题描述:
我想使用Swift软件包管理器在我的版本中包含一个静态的 C库。 Apple's documentation显示共享库的过程,但我希望有一种使用静态的方法。我可以使用swiftc
链接静态库,所以我希望我能够使用swift build
来做到这一点似乎是合理的。在Swift软件包管理器中使用静态C库
我有一个小例子问题,它使用一个静态C库,其中包含一个用于将两个数字相乘的函数。 (注:我在Linux上运行斯威夫特3预览1)
,看起来像这样的目录结构:例如
example/
Package.swift
main.swift
.git/
CMult/
Package.swift
module.modulemap
mult.h
libmult.a
.git/
内容/ Package.swift:
import PackageDescription
let package = Package(
name: "example",
dependencies: [
.Package(url: "../CMult", majorVersion: 1)
]
)
内容例如/ main.swift:CMult/Package.swift的
import CMult
let n: Int32 = mult2(3, 5) // "int mult2(int,int)" is in mult.h and libmult.a
print("Result = \(n)")
内容:
项import PackageDescription
let package = Package(
name: "CMult"
)
内容CMult/module.modulemap:
module CMult [system] {
header "./mult.h"
link "mult"
export *
}
现在是,当我运行example$ swift build
,链接器与错误抱怨的问题, “在/ usr /斌/劳工处:找不到-lmult” ,这并不奇怪,因为它不在那里,我没有告诉它在哪里看。我想要的是在模块映射中指定-L标志的一些方法,指定在哪里查找.a文件(这是我如何链接到我的.a与swiftc
)。一个不太理想但可接受的解决方案似乎是将LD_LIBRARY_PATH环境变量设置为在CMult /中查找,但没有更改错误。
任何想法?谢谢。
答
我不知道的一种方式来指定一个模块地图库的位置,但这里是我工作:
example$ swift build -Xlinker -L../CMult
您可以通过运行
swift build --help
找到一些有用的选项
至于LD_LIBRARY_PATH
,这是搜索共享库。对于静态,它将是LIBRARY_PATH
,但那个在我尝试时并不适用于swift build
。不过,它确实与gcc
一起工作。