2016-07-21 55 views
4

我想使用Swift软件包管理器在我的版本中包含一个静态的 C库。 Apple's documentation显示共享库的过程,但我希望有一种使用静态的方法。我可以使用swiftc链接静态库,所以我希望我能够使用swift build来做到这一点似乎是合理的。在Swift软件包管理器中使用静态C库

我有一个小例子问题,它使用一个静态C库,其中包含一个用于将两个数字相乘的函数。 (注:我在Linux上运行斯威夫特3预览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) 
    ] 
) 

内容例如/ main.swift:CMult/Package.swift的

import CMult 

let n: Int32 = mult2(3, 5) // "int mult2(int,int)" is in mult.h and libmult.a 
print("Result = \(n)") 

内容:

import PackageDescription 

let package = Package(
    name: "CMult" 
) 

内容CMult/module.modulemap:

module CMult [system] { 
    header "./mult.h" 
    link "mult" 
    export * 
} 

现在是,当我运行example$ swift build,链接器与错误抱怨的问题, “在/ usr /斌/劳工处:找不到-lmult” ,这并不奇怪,因为它不在那里,我没有告诉它在哪里看。我想要的是在模块映射中指定-L标志的一些方法,指定在哪里查找.a文件(这是我如何链接到我的.a与swiftc)。一个不太理想但可接受的解决方案似乎是将LD_LIBRARY_PATH环境变量设置为在CMult /中查找,但没有更改错误。

任何想法?谢谢。

回答

2

我不知道的一种方式来指定一个模块地图库的位置,但这里是我工作:

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

您可以通过运行

swift build --help 
找到一些有用的选项

至于LD_LIBRARY_PATH,这是搜索共享库。对于静态,它将是LIBRARY_PATH,但那个在我尝试时并不适用于swift build。不过,它确实与gcc一起工作。