【问题标题】:Linking a C library and its supporting library in Swift (linux)在 Swift (linux) 中链接 C 库及其支持库
【发布时间】:2016-06-07 13:50:48
【问题描述】:

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

【问题讨论】:

标签: linux swift gsl


【解决方案1】:

libgslcblas 添加第二行link 即可:

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

您可能还需要添加 link "m",尽管我不必在我的盒子上这样做 (Ubuntu 14.04)。

我没有在 Swift 文档中找到对此的具体建议,我不得不做出有根据的猜测,但它确实有效。 Linux 上的 Swift 正在进行中,包管理器仅适用于 Swift 3.0 开发快照,Swift 3.0 是一种不稳定的、积极开发的语言的最新版本。这种常见的场景没有得到很好的记录,这一事实应该让您对技术的成熟度有所了解。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多