2016-06-07 51 views
3

我想在Swift中使用GNU科學庫,特別是我想使用gsl_rng.h的例程。所以我基本上遵循https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md(我使用Linux,而不是OS X)在Swift中鏈接C庫及其支持庫(linux)

我創建模塊

module CGSL [system] { 
    header "/usr/include/gsl/gsl_rng.h" 
    link "gsl" 
    export * 
} 

但是,我不能建立我的計劃,因爲我得到很多的那種消息undefined reference to 'cblas_dasum'。而事實上,作爲GSL文檔指出

要鏈接對你需要指定主庫 和支持CBLAS庫,它提供標準的基本線性代數 子程序庫。如果您的系統沒有提供適合的CBLAS實現,則在庫libgslcblas.a中的 中提供。該 下面的示例演示如何將應用程序與庫鏈接,

$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm 

我該怎麼辦既-lgsl-lgslcblas鏈接?

+0

https://developer.apple.com/library/ios/recipes/xcode_help-project_editor/Articles/AddingaLibrarytoaTarget.html – Alexander

回答

2

添加第二個linklibgslcblas將這樣的伎倆:

module CGSL [system] { 
    header "/usr/include/gsl/gsl_rng.h" 
    link "gsl" 
    link "gslcblas" 
    export * 
} 

你也可能需要添加link "m",即使我沒有這樣做,在我的箱子(Ubuntu的14.04)。

我在Swift文檔中沒有找到關於這方面的具體建議,不得不作出有根據的猜測,但它工作。 Swift Linux正在進行中,軟件包管理器僅適用於Swift 3.0開發快照,Swift 3.0是一種不穩定的,積極開發的最新版本的語言。事實上,這樣一個常見的情況沒有很好的記錄應該給你一個技術的成熟的想法。

作爲軟件包管理器的替代方案,您可能需要考慮使用橋接標題,如本問題答案中所述: Compile C code and expose it to Swift under Linux

無論你做什麼,更大的挑戰將是從Swift調用GSL API,因爲API使用了很多非基元類型。要解決這個問題,可以考慮編寫一個簡單的界面,可以很容易地從Swift調用C包裝。然後可以使用橋接頭或系統模塊來調用包裝器。