在Swift(linux)中链接C库及其支持库

时间:2016-06-07 13:50:49

标签: linux swift gsl

我想在Swift中使用GNU科学库,特别是我想使用gsl_rng.h中的例程。所以我基本上遵循https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md(我使用的是Linux,而不是OS X)

我将模块创建为

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

1 个答案:

答案 0 :(得分:2)

link添加第二条libgslcblas行可以解决问题:

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

你可能还需要添加link "m",即使我没有在我的盒子上这样做(Ubuntu 14.04)。

我没有在Swift文档中找到关于此的具体建议,并且必须做出有根据的猜测,但它有效。 Swift on Linux正在进行中,而Package Manager仅适用于Swift 3.0开发快照,Swift 3.0是一种不稳定的,积极开发的最新版本的语言。事实上,这种常见情况没有得到很好的记录,这可以让您了解技术的成熟度。

作为软件包管理器的替代方案,您可能需要考虑使用桥接标头,如此问题的答案中所述: Compile C code and expose it to Swift under Linux

无论您采用哪种方式,更大的挑战都是从Swift调用GSL API,因为API使用了许多非基本类型。要解决这个问题,可以考虑编写一个带有简化接口的C包装器,可以从Swift轻松调用。然后可以使用桥接头或系统模块调用包装器。