Phi*_*lip 7 swift swift-package-manager
我想使用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/
Run Code Online (Sandbox Code Playgroud)
example / Package.swift的内容:
import PackageDescription
let package = Package(
name: "example",
dependencies: [
.Package(url: "../CMult", majorVersion: 1)
]
)
Run Code Online (Sandbox Code Playgroud)
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)")
Run Code Online (Sandbox Code Playgroud)
CMult / Package.swift的内容:
import PackageDescription
let package = Package(
name: "CMult"
)
Run Code Online (Sandbox Code Playgroud)
CMult / module.modulemap的内容:
module CMult [system] {
header "./mult.h"
link "mult"
export *
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是当我运行时example$ swift build,链接器抱怨错误“ / usr / bin / ld:找不到-lmult”,这并不奇怪,因为它不存在并且我也没有告诉它要去哪里。我想要以某种方式在模块映射中指定-L标志,指定在何处查找.a文件(这是我通过。链接到.a的方式swiftc)。一个不太理想但可接受的解决方案似乎是将LD_LIBRARY_PATH环境变量设置为在CMult /中查找,但这并没有改变错误。
有任何想法吗?谢谢。
我不知道在模块映射中指定库位置的方法,但是这对我有用:
example$ swift build -Xlinker -L../CMult
Run Code Online (Sandbox Code Playgroud)
您可以通过运行找到其他有用的选项
swift build --help
Run Code Online (Sandbox Code Playgroud)
至于LD_LIBRARY_PATH,这是用于搜索共享库。对于static来说应该是LIBRARY_PATH,但是swift build当我尝试使用它时却无法使用。确实适用于gcc。
| 归档时间: |
|
| 查看次数: |
1674 次 |
| 最近记录: |