您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-27 10:06 567 查看
编译好的版本放到了这里,包括静态库和动态库。大家直接用吧。

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


这几个模块都是比较容易的。基本上把代码添加进来就可以编译通过。下篇博客介绍编译时会报错的几个模块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐