在Swift中链接一个C库和它的支持库(linux)

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

我创build模块为

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

然而,我不能build立我的程序,因为我得到了很多类似undefined reference to 'cblas_dasum'的消息。 事实上,正如GSL的文件所述

为了链接库,你需要指定主库和支持CBLAS库,它提供了标准的基本线性代数子程序。 如果你的系统没有提供一个合适的CBLAS实现,则在库libgslcblas.a中提供。 以下示例显示如何将应用程序链接到库,

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

我该怎么做才能链接-lgsl-lgslcblas

libgslcblas添加第二个link将做的伎俩:

 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是一个不稳定的,积极开发的最新版本的语言。 事实上,这样一个共同的情况没有很好的记录应该给你一个技术的成熟的想法。

作为软件包管理器的替代方案,您可能需要考虑使用桥接头来解决此问题的答案: 编译C代码并将其暴露给Linux下的Swift 。

无论你做什么,更大的挑战将是从Swift调用GSL API,因为API使用了很多非原始类型。 要解决这个问题,可以考虑编写一个简单的界面,可以很容易地从Swift调用C包装。 然后可以使用桥接头或系统模块来调用包装器。