9

我想使用 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/

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: cannot find -lmult”,这并不奇怪,因为它不存在,而且我还没有告诉它去哪里看。我想要的是在模块映射中指定 -L 标志的某种方式,指定在哪里查找 .a 文件(这是我用 .a 链接到我的 .a 的方式swiftc)。一个不太理想但可接受的解决方案似乎是将 LD_LIBRARY_PATH 环境变量设置为在 CMult/ 中查找,但这并没有改变错误。

有任何想法吗?谢谢。

4

1 回答 1

6

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

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

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

swift build --help

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

于 2016-08-07T23:44:28.120 回答