将静态C库与Swift软件包管理器一起使用

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 /中查找,但这并没有改变错误。

有任何想法吗?谢谢。

Ana*_*i P 6

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

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