一尘不染

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

linux

我想在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


阅读 198

收藏
2020-06-07

共1个答案

一尘不染

为添加第二link行将libgslcblas达到目的:

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

link "m"即使我不必在盒子上这样做,也可能需要添加(Ubuntu 14.04)。

我没有在Swift文档中找到关于此的具体建议,因此不得不做出有根据的猜测,但是它确实有效。Linux上的Swift正在开发中,并且PackageManager仅可用于Swift 3.0开发快照,Swift3.0是不稳定的,积极开发的最新版本。这样的常见情况没有得到充分记录的事实应该使您对技术的成熟有所了解。

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

2020-06-07