2016-07-21 49 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一起工作。