gpt4 book ai didi

swift - 将静态 C 库与 Swift 包管理器一起使用

转载 作者:搜寻专家 更新时间:2023-10-30 22:12:45 24 4
gpt4 key购买 nike

我想使用 Swift 包管理器在我的构建中包含一个static 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/

示例/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 链接我的 .a 的方式)。一个不太理想但可以接受的解决方案似乎是将 LD_LIBRARY_PATH 环境变量设置为在 CMult/中查找,但这并没有改变错误。

有什么想法吗?谢谢。

最佳答案

我不知道在模块映射中指定库位置的方法,但这是对我有用的方法:

example$ swift build -Xlinker -L../CMult

你可以通过运行找到一些其他有用的选项

swift build --help

至于LD_LIBRARY_PATH,那是用来搜索共享库的。对于静态,它将是 LIBRARY_PATH,但是当我尝试它时,它不适用于 swift build。不过,它确实适用于 gcc

关于swift - 将静态 C 库与 Swift 包管理器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38515748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com