当前库可以在linux上面运行,也可以在windows环境中visual studio进行编译测试,所以安装教程包含这两个大环境下面。
windows
在windows10中VS2019中配置GSL库(version: 2.7)
1. GSL简介
GSL官网
GNU Scientific Library (GSL) 是一个供 C 和 C++ 程序员使用的数字库。它是 GNU 通用公共许可证下的免费软件。
该库提供了广泛的数学例程,例如随机数生成器、特殊函数和最小二乘拟合。总共有超过 1000 个函数和一个广泛的测试套件,Matlab 的大部分函数几乎都能借助它实现。
二、本机环境
win10、vs2019
3. 实现方法
有两种方法可以使用,直接在 Visual Studio 2019 中下载 NuGet 程序包;在 GitHub 上拉取别人做好的源码包,自己编译生成最新的库文件然后集合到自己的项目中进行开发测试。
方法一:下载 NuGet 程序包
打开 VS2019 — 项目 — 管理 NuGet 程序包 — 搜索 gsl
选择你自己相应的环境 x86 或者 x64,安装完成后,这个包会出现你的项目目录的packages 中,include头文件即可使用。
方法二:GitHub 下载源码包
- 使用 git 下拉 git clone https://github.com/BrianGladman/gsl.git my_gsl。如果下载太慢,可以使用这个命令:git clone https://github.com.cnpmjs.org/BrianGladman/gsl.git my_gsl。如果不想自己编译可以直接去这里下载别人编译好的(包含有 release 和 debug 的 x86、x64 版本)https://download.csdn.net/download/libaineu2004/15317425。若使用别人编译好的直接跳至第5步
- vs2019打开并运行 build.vc \ gsl.lib.sln 即可实现静态库的编译 — 在 lib 目录中生成 .lib 文件
- vs2019打开并运行 build.vc \ gsl.dll.sln 即可实现动态库的编译 — 在 dll 目录中生成 .dll 文件以上两个工程直接运行会出现一些报错,可以参考这篇文章的前半部分来完成配置:VS2019配置GSL库
- 为项目添加相应的头文件和 lib 库(据我的观察应该是GSL 2.7版本的)
1. 添加头文件:项目 — 属性 — C/C++ — 常规 — 附加包含目录
E:\GSL\gsl\include
这里需要注意,这种一般是直接发布库的形式,然后通过编译脚本的方式进行编译。
在vs2019中本人是直接VC++目录>>包含目录将本工程目录中包含的gsl头文件目录直接给包含进来这种方式进行库的使用
2. 添加 lib 静态库路径:项目 — 属性 — 链接器 — 常规 — 附加库目录
E:\GSL\gsl\lib\x64\Debug
3. 添加引用的 lib 文件名:项目 — 属性 — 链接器 — 输入 — 附加依赖项
cblas.lib;gsl.lib
配置时要注意自己工程的版本,debug 版本和 release 版本都有相应的 lib 库。
完成以上步骤即可直接 include 头文件开始开心调库了!!
大家在调库的时候可以参考下面给出的官方API文档,很有帮助哦~
如何实现Windows MSVC的源码编译?
http://www.gnu.org/software/gsl/extras/native_win_builds.html
有热心网友实现了:
https://github.com/BrianGladman/gsl
本人使用的是热心网友提供的代码,编译过程提示MSB8020 无法找到 v143 的生成工具(平台工具集 =“v143”)错误,解决方法是通过如下:
将v143修改为visual studio2019的v142即可
请下载源码包,然后:
1、使用VS2019打开\gsl-master\build.vc\gsl.lib.sln即可实现静态库的编译,编译生成的结果文件的路径是\gsl-master\lib
2、使用VS2019打开\gsl-master\build.vc\gsl.dll.sln即可实现动态库的编译,编译生成的结果文件的路径是\gsl-master\dll
编译完成,会在路径\gsl-master\gsl统一整理好*.h头文件
4. 测试
通过如下一段代码进行库编译与添加正确性测试
#include <gsl/gsl_sf_bessel.h>
int test(void)
{
double x = 5.0;
double y = gsl_sf_bessel_J0(x);
printf("J0(%g) = %.18e\n", x, y);
return 0;
}
四、参考文章
GSL官网API文档
C++ 数学计算库汇总
在VS中添加lib库的三种方法
————————————————
版权声明:本文为CSDN博主「G.Chenhui」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/G_C_H/article/details/120924797
linux
GSL安装和使用教程
GSL 简介
GSL 下载
GSL安装
GSL使用
GSL常用函数(持续更新)
矩阵运算
1.Matrix operations 详见手册8.4.9
2.矩阵乘法
2.矩阵求逆
GSL 简介
gsl(GNU Scientific Library)是专门为应用数学和科学技术领域的数值计算提供支持的软件库。gsl使用C语言编写,同时也为其他语言做了相应的封装。gsl在GNU通用公共许可下是免费的。该函数库提供了广泛的数学算法的实现函数,包括随机数生成器,特殊函数和最小二乘拟合等等。目前该函数库提供有超过1000个函数,这些函数包含的范围有:复数计算、多项式求根、特殊函数、向量和矩阵运算、排列、组合、排序、线性代数、特征值和特征向量、快速傅里叶变换(FFT)、数值积分、随机数生成、随机数分布、统计、蒙特卡洛积分、模拟退火、常微分方程组、插值、数值微分、方程求根、最小二乘拟合、小波变换等
GSL 下载
下载GSL安装文件: 链接: http://mirrors.ustc.edu.cn/gnu/gsl.
GSL文档在线:链接:https://www.gnu.org/software/gsl/doc/html/index.html.
GSL文档下载:链接:https://www.gnu.org/software/gsl/doc/latex/gsl-ref.pdf.
GSL安装
1. 解压压缩包:$ tar -zxvf gsl-2.7.tar.gz
2. 创建安装目录:$ mkdir /home/ccchenji/Desktop/gsl_gcc
注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。
3. 进入源码目录:$ cd /home/ccchenji/Desktop/gsl-2.7
注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。
4.配置configure文件
# 参数含义
# CC:指定编译工具链
# --prefix: 指定库的安装目录
# --host: 指定安装平台,可选,交叉编译要制定安装平台如在arm上编译 --host=arm
# ./configure -h: 可以得到配置的帮助信息
# linux上安装
$ ./configure CC="gcc" --prefix=/home/ccchenji/Desktop/gsl_gcc
#注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。
5.使用make进行编译
$ make
1
6.使用make install进行安装
$ make install
1
7.使用make installcheck检查安装是否成功
$ make installcheck
1
GSL使用
1.新建工程文件夹
$ mkdir /home/ccchenji/Desktop/gsl_test
#注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。
1
2
2.新建makefile文件并编辑
#进入gsl_gcc文件夹并新建makefile文件
$ touch makefile
# 编辑makefile文件
$ vim makefile
1
2
3
4
makefile文件内容(如果出现错误注意tab的缩进,gcc前要求一个tab的缩进,最好自己手敲一遍,直接粘贴可能出问题)
#注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。
IPATH=-I/home/ccchenji/Desktop/gsl_gcc/include
LPATH=-L/home/ccchenji/Desktop/gsl_gcc/lib
#这里直接链接的静态库文件
main:main.c
gcc main.c $(IPATH) $(LPATH) -l:libgsl.a -l:libgslcblas.a -o main
.PHONY:clean
clean:
rm -rf main
3.新建main.c文件并编辑
#进入gsl_gcc文件夹并新建main.c文件
$ touch main.c
# 编辑makefile文件
$ vim main.c
1
2
3
4
main.c文件内容
#include <stdio.h>
#include <gsl/gsl_matrix.h>
int main (void)
{
int i, j;
gsl_matrix * m = gsl_matrix_alloc (10, 3);
for (i = 0; i < 10; i++)
for (j = 0; j < 3; j++)
gsl_matrix_set (m, i, j, 0.23 + 100*i + j);
for (i = 0; i < 100; i++)
for (j = 0; j < 3; j++)
printf ("m(%d,%d) = %g\n", i, j,
gsl_matrix_get (m, i, j));
gsl_matrix_free (m);
return 0;
}
4.使用make命令编译main.c文件
$ make
#编译后生成main文件
#运行main文件
$ ./main
1
2
3
4
运行结果
GSL常用函数(持续更新)
矩阵运算
1.Matrix operations 详见手册8.4.9
/*
This function adds the elements of matrix b to the elements of matrix a.
The result a(i, j) ← a(i, j) + b(i, j) is stored in a and b remains unchanged.
The two matrices must have the same dimensions.
*/
int gsl_matrix_add(gsl_matrix *a, const gsl_matrix *b)
/*
This function subtracts the elements of matrix b from the elements of matrix a.
The result a(i, j) ← a(i, j) − b(i, j) is stored in a and b remains unchanged.
The two matrices must have the same dimensions.
*/
int gsl_matrix_sub(gsl_matrix *a, const gsl_matrix *b)
2.矩阵乘法
要使用用gcc编译gsl_blas_dgemm 函数必须使用动态库,静态库链接会报错(交叉编译工具链默认使用静态库,对交叉编译工具链,可以使用静态库)
1.配置动态链接库路径
#编辑.bashrc文件
$ vim /home/ccchenji/.bashrc
#在文件末尾加入以下代码,以下代码的作用是将动态连接库加入到gcc默认搜索路径
export LD_LIBRARY_PATH=/home/ccchenji/Desktop/gsl_gcc/lib:$LD_LIBRARY_PATH
1
2
3
4
2.重写makefile文件
IPATH=-I/home/ccchenji/Desktop/gsl_gcc/include
LPATH=-L/home/ccchenji/Desktop/gsl_gcc/lib
#gcc 这里链接动态库
main:main.c
gcc main.c $(IPATH) $(LPATH) -lm -lgsl -lgslcblas -o main
.PHONY:clean
clean:
rm -rf main
3.gsl_blas_dgemm()函数说明
//函数原型
int gsl_blas_dgemm( CBLAS_TRANSPOSE_t TransA,
CBLAS_TRANSPOSE_t TransB,
double alpha,
const gsl_matrix *A,
const gsl_matrix *B,
double beta,
gsl_matrix *C)
/*
参数说明
1.CBLAS_TRANSPOSE_t 可取值:
CblasNoTrans:矩阵不需要转置
CblasTrans: 矩阵需要转置
2.alpha、beta数乘系数
3.计算表达式: C = alpha * op( A ) * op( B ) + beta * C
*/
4.gsl_blas_dgemm()函数使用例程
include <stdio.h>
#include <gsl/gsl_blas.h>
#include <math.h>
int main (void)
{
double a[] = { 0.11, 0.12, 0.13,
0.21, 0.22, 0.23 };
double b[] = { 1011, 1012,
1021, 1022,
1031, 1032 };
double c[] = { 0.00, 0.00,
0.00, 0.00 };
gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3);
gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2);
gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2);
/* Compute C = A B */
gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
1.0, &A.matrix, &B.matrix,
0.0, &C.matrix);
printf ("[ %g, %g\n", c[0], c[1]);
printf (" %g, %g ]\n", c[2], c[3]);
return 0;
}
2.矩阵求逆
示例代码
#include <stdio.h>
#include <gsl/gsl_linalg.h>
int main (void)
{
double a_data[] = { 1.0, 0.6, 0.0,
0.0, 1.5, 1.0,
0.0, 1.0, 1.0 };
/*
* Inverse is
* 1 -1.2 1.2
* 0 2.0 -2.0
* 0 -2.0 3.0
*/
double inva[9];
int s, i, j;
gsl_matrix_view m
= gsl_matrix_view_array(a_data, 3, 3);
gsl_matrix_view inv
= gsl_matrix_view_array(inva,3,3);
gsl_permutation * p = gsl_permutation_alloc (3);
printf("The matrix is\n");
for (i = 0; i < 3; ++i)
for (j = 0; j < 3; ++j)
printf(j==2?"%6.3f\n":"%6.3f ", gsl_matrix_get(&m.matrix,i,j));
gsl_linalg_LU_decomp (&m.matrix, p, &s);
gsl_linalg_LU_invert (&m.matrix, p, &inv.matrix);
printf("The inverse is\n");
for (i = 0; i < 3; ++i)
for (j = 0; j < 3; ++j)
printf(j==2?"%6.3f\n":"%6.3f ",gsl_matrix_get(&inv.matrix,i,j));
gsl_permutation_free (p);
return 0;
}
————————————————
版权声明:本文为CSDN博主「嵌入式魔法师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37649216/article/details/120233852