我想使用Swift包管理器在我的构建中包含一个静态 C库。 Apple's documentation显示了共享库的过程,但我希望有一种方法可以使用静态。我能够使用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:找不到-lmult",这是不可思议的它不在那里,我还没有告诉它在哪里看。我想要的是在模块映射中指定-L标志的某种方式,指定在哪里查找.a文件(这是我与。swiftc
链接的方式。)一个不太理想但可接受的解决方案似乎是将LD_LIBRARY_PATH环境变量设置为在CMult /中查看,但这并没有改变错误。
有什么想法吗?感谢。
答案 0 :(得分:4)
我不知道在模块地图中指定库位置的方法,但这对我有用:
example$ swift build -Xlinker -L../CMult
您可以通过运行
找到一些其他有用的选项swift build --help
至于LD_LIBRARY_PATH
,用于搜索共享库。对于静态,它将是LIBRARY_PATH
,但是当我尝试使用swift build
时,它不能用于gcc
。但它确实适用于#!/usr/bin/python
#-*- coding: utf-8 -*-
f = open('tag.txt', 'r', encoding='utf=8')
s = f.readlines()
z = open('tagresult.txt', 'w')
y = z.write(s)
z.close
。