在Swift(linux)中链接C库及其支持库
我想在Swift中使用GNU科学库,特别是我想使用gsl_rng.h中的例程。因此,我基本上遵循(我使用的是Linux,而不是OSX) 我将模块创建为在Swift(linux)中链接C库及其支持库,linux,swift,gsl,Linux,Swift,Gsl,我想在Swift中使用GNU科学库,特别是我想使用gsl_rng.h中的例程。因此,我基本上遵循(我使用的是Linux,而不是OSX) 我将模块创建为 module CGSL [system] { header "/usr/include/gsl/gsl_rng.h" link "gsl" export * } 然而,我无法构建我的程序,因为我收到了大量未定义的消息,这些消息引用了“cblas_dasum”。事实上,正如GSL的文件所述 要针对库进行链接,需要指定两个主库 以及一个
module CGSL [system] {
header "/usr/include/gsl/gsl_rng.h"
link "gsl"
export *
}
然而,我无法构建我的程序,因为我收到了大量未定义的消息,这些消息引用了“cblas_dasum”。事实上,正如GSL的文件所述
要针对库进行链接,需要指定两个主库
以及一个支持CBLAS的库,该库提供标准的基本线性
代数子程序。中提供了合适的CBLAS实现
如果您的系统没有提供libgslcblas.a库,则该库为libgslcblas.a。这个
下面的示例演示如何将应用程序链接到库
$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm
如何链接
-lgsl
和-lgslcblas
?为libgslcblas
添加第二个链接
行将实现以下目的:
module CGSL [system] {
header "/usr/include/gsl/gsl_rng.h"
link "gsl"
link "gslcblas"
export *
}
您可能还需要添加链接“m”
,即使我不必在我的设备上这样做(Ubuntu 14.04)
我没有在Swift文档中找到关于这一点的具体建议,不得不做出有根据的猜测,但它起了作用。Linux上的Swift正在开发中,软件包管理器仅适用于Swift 3.0开发快照,Swift 3.0是一种不稳定的、积极开发的最新版本的语言。这种常见场景没有很好的文档记录,这一事实应该让您了解该技术的成熟度
作为包管理器的替代品,您可能需要考虑使用桥接头,如对这个问题的回答所描述的:
无论采用哪种方式,更大的挑战将是从Swift调用GSL API,因为该API使用了大量非原语类型。为了解决这个问题,考虑编写一个C封装器,用一个简化的接口,可以很容易地从SWIFT调用。然后可以使用桥接头或系统模块调用包装器