将静态 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
。
我想使用 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
。