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

时间:2016-07-21 23:05:48

标签: swift swift-package-manager

我想使用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 /中查看,但这并没有改变错误。

有什么想法吗?感谢。

1 个答案:

答案 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