Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(2)

编译好的版本放到了这里,包括静态库和动态库。大家直接用吧。
http://download.csdn.net/detail/liyuanbhu/9618257

Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(2)

上一篇博客中介绍了如何生成 gslcblas.lib 和 gslcblas.dll。

今天继续介绍如何生成 gsl 的其他部分。

gsl 是一个比较大的库,直接将 gsl 的全部内容打包成一个库文件虽然是可行的,但是会很麻烦。因为,gsl 不同模块有许多相同名字的源文件。比如 vector 目录下有 oper.c ,matrix 目录下也有 oper.c。这两个 oper.c 都会编译为 oper.obj ,而且放置在同一个目录下,结果就是互相覆盖。为了解决这个问题,我们就不得不修改文件名。类似这样需要修改的地方有几十处,改起来很麻烦。所以我就选了另一种方式。

按模块编译,生成一系列的静态库,比如 gsl_vector.lib、gsl_matrix.lib 等等。
之后再将这些小的静态库打包为一个 gsl.lib。
有了 gsl.lib 还可以生成 gsl.dll。

下面的顺序与 gsl ref 中对各个模块介绍的顺序是相同的。

建立一个新目录:gsl 作为我们项目路径。下面的子目录如下:

gsl
--include
----gsl
--source

这里可以将上一篇博客建立的目录改个名,include 目录里面的文件全都保留。

gsl_sys 模块

这个模块主要是提供一些辅助函数:gsl_isnan、gsl_isinf、gsl_finite 等。

sys 目录拷贝到 source 中。
gsl_mode.h 拷贝到 include\gsl 中。
build.h 拷贝到 include 中。

项目文件如下:

#-------------------------------------------------
#
# Project created by QtCreator 2016-08-26T20:38:46
#
#-------------------------------------------------

QT       -= core gui

TARGET = gsl_sys
TEMPLATE = lib
CONFIG += staticlib

INCLUDEPATH += ./include/

SOURCES += \
    source/sys/coerce.c \
    source/sys/expm1.c \
    source/sys/fcmp.c \
    source/sys/fdiv.c \
    source/sys/hypot.c \
    source/sys/infnan.c \
    source/sys/invhyp.c \
    source/sys/ldfrexp.c \
    source/sys/log1p.c \
    source/sys/minmax.c \
    source/sys/pow_int.c \
    source/sys/prec.c

unix {
    target.path = /usr/lib
    INSTALLS += target
}

DISTFILES +=

编译就可以生成 gsl_sys.lib 了。
下面的代码片段可以简单的测试生成的 gsl_sys.lib 是否工作正常。

#include <gsl/gsl_math.h>

#define HAVE_INLINE
void sys_test()
{
    double y = gsl_pow_4 (3.141);
    printf("%f\n", y);

    y = gsl_log1p(0.1);
    printf("%f\n", y);

    int a = GSL_IS_ODD (11);
    printf("%d\n", a);

    a = gsl_isnan(GSL_NAN);
    printf("%d\n", a);
}

gsl_complex 模块

这个模块提供对复数运算的支持。对应 gsl ref 上的第五章。

gsl_complex_math.h 和 gsl_complex.h 拷贝到 include\gsl 目录中。

项目文件如下:

#-------------------------------------------------
#
# Project created by QtCreator 2016-08-26T20:38:46
#
#-------------------------------------------------

QT       -= core gui

TARGET = gsl_complex
TEMPLATE = lib
CONFIG += staticlib

INCLUDEPATH += ./include/

SOURCES += \
    source/complex/math.c \
    source/complex/inline.c

unix {
    target.path = /usr/lib
    INSTALLS += target
}

DISTFILES +=

测试代码如下:

#include <gsl/gsl_complex.h>
#include <gsl/gsl_complex_math.h>

void complex_test()
{

  double r = 10;
  double t = 0.5 ;
  double x = r * cos(t), y = r * sin(t) ;
  gsl_complex z = gsl_complex_polar (r, t) ;
  printf("%f, %f\n", GSL_REAL(z),GSL_IMAG(z) );
  printf("%f, %f\n", x, y );
}

gsl_poly 模块

gsl_errno.h 和 gsl_poly.h 拷贝到 include/gsl

项目文件如下:

#-------------------------------------------------
#
# Project created by QtCreator 2016-08-26T20:38:46
#
#-------------------------------------------------

QT       -= core gui

TARGET = gsl_poly
TEMPLATE = lib
CONFIG += staticlib

INCLUDEPATH += ./include/

SOURCES += \
    source/poly/dd.c \
    source/poly/deriv.c \
    source/poly/eval.c \
    source/poly/solve_cubic.c \
    source/poly/solve_quadratic.c \
    source/poly/zsolve.c \
    source/poly/zsolve_cubic.c \
    source/poly/zsolve_init.c \
    source/poly/zsolve_quadratic.c

unix {
    target.path = /usr/lib
    INSTALLS += target
}

DISTFILES +=

测试代码如下:

#include <gsl/gsl_poly.h>
void poly_test()
{
    int i;
    /* coefficients of P(x) = -1 + x^5 */
    double a[6] = { -1, 0, 0, 0, 0, 1 };
    double z[10];
    gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc (6);
    gsl_poly_complex_solve (a, 6, w, z);
    gsl_poly_complex_workspace_free (w);
    for (i = 0; i < 5; i++)
    {
        printf ("z%d = %+.18f %+.18f\n", i, z[2*i], z[2*i+1]);
    }
}

编译这个测试代码时会报错。提示 gsl_error 没找到。 gsl_error 是在 gsl_err 模块中的,我们还没有编译,所以肯定是找不到的。下面就来生成 gsl_err 模块。

gsl_err 模块

gsl_message.h 和 gsl_error.h 拷贝到 include/gsl 目录中。

项目文件如下:

#-------------------------------------------------
#
# Project created by QtCreator 2016-08-26T20:38:46
#
#-------------------------------------------------

QT       -= core gui

TARGET = gsl_err
TEMPLATE = lib
CONFIG += staticlib

INCLUDEPATH += ./include/

SOURCES += \
    source/err/error.c \
    source/err/message.c \
    source/err/stream.c \
    source/err/strerror.c

unix {
    target.path = /usr/lib
    INSTALLS += target
}

DISTFILES +=

有了gsl_err.lib 后,就可以测试 gsl_poly 模块了。我这里的输出结果如下,与 gsl ref 上的输出略有差异,但是也是正确的。

z0 = -0.809016994374947670 +0.587785252292473360
z1 = -0.809016994374947670 -0.587785252292473360
z2 = +0.309016994374947510 +0.951056516295152980
z3 = +0.309016994374947510 -0.951056516295152980
z4 = +0.999999999999999890 +0.000000000000000000

这几个模块都是比较容易的。基本上把代码添加进来就可以编译通过。下篇博客介绍编译时会报错的几个模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值