GSL库安装与测试

GSL的安装与测试是一个心酸的过程,记录如下。注:win7系统,vs2015,不同版本可能略有差异。


现在已经解决。我用同事发给我的gsl库就可以全部正常运行。说明是因为库不正确,同事给我的gsl库是老版本的,不是官网现在的新版本。我已经把直接可用的gsl库上传至我的csdn资源下载里面了。有需要的自己拿。没有积分的可以私我发给你。
没有兴趣的就不用看下面的细节了。

gsl源文件安装包的下载与安装

  从http://gnuwin32.sourceforge.net/packages/gsl.htm下载的两个文件gsl-1.8.exe和gsl-1.8-src.exe,依次安装,全程点击“下一步”默认安装就行。安装第一个gsl-1.8.exe的时候注意一下安装路径在哪里就可以了。
  找到刚才的安装路径,找到lib文件夹,比如我的是D:\Program Files (x86)\GnuWin32\lib。打开后发现只有.a和.def文件(Ps:XXX.a是LINUX系统中的静态链接库文件,.def是文件为链接器提供有关被链接程序的导出、属性及其他方面的信息,通常用语dll的生成),没有我们需要的lib文件,也就是说我们需要把LINUX系统的.a文件转为windows系统可以用的.lib文件。
  下面是生成lib文件的步骤。
  1.在环境变量中添加D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin,也就是你的vs的安装路径下的bin文件夹。如果是win10系统,还需要加上刚才安装的gsl目录下的D:\Program Files (x86)\GnuWin32\bin到环境变量;(这一步及其重要,但是很多教程都没有提及。)
  2.打开cmd命令窗口,输入d:回车,输入cd D:\Program Files (x86)\GnuWin32\lib回车,一次输入下面2条语句:
lib /machine:i386 /def:libgsl.def
lib /machine:i386 /def:libgslcblas.def,
  如果出现
在这里插入图片描述
说明lib文件生成成功,此时D:\Program Files (x86)\GnuWin32\lib多了4个文件,分别是
在这里插入图片描述
这2个lib文件就是我们后面需要用的。

将GSL加载进vs中

方法1:直接加紧vs的安装目录里

1.添加D:\Program Files (x86)\GnuWin32\include里的gsl文件夹至D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include;
2.添加D:\Program Files (x86)\GnuWin32\bin里的2个dll文件至D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;
3.添加D:\Program Files (x86)\GnuWin32\lib里的lib文件至D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib。

方法2:在vs的工程里

在vs工程的属性配置里添加include、dll和lib文件:
在这里插入图片描述
在这里插入图片描述

GSL库的测试

测试gsl库的安装成功与否,最好用gsl的reference里提供的代码测试,因为可以排除程序本身的错误。gsl的官方reference下载链接为https://www.gnu.org/software/gsl/doc/latex/gsl-ref.pdf
注意在首行加上 #define GSL_DLL,或者在工程的属性配置->命令参数里加上/D “GSL_DLL”
可以参考ref里的151页程序。


在测试的时候,我遇到了问题,结果怎么都报错,后来调试发现是调试行和实际运行不是同一行。后来参考csdn一位博主的文章,才算是解决了问题。
https://blog.csdn.net/lsldd/article/details/46049481
因为代码是直接从reference上拷贝的,代码中有非ASCII字符导致的。

代码中有非ASCII字符的原因可能导致2种错误形式:
一种是:Visual Studio有时候会出现单步调试时候,断点处变成不可命中,始终提示“当前不会命中断点。源代码与原始版本不同。”
另一种是:编译不报错,但是单步调试时实际执行的代码与源码行号不匹配,就是我遇到的情况。
解决方法:
1、在VS中打开该文件,打开另存为(Save as)对话框。
2、点击对话框中“保存(Save)”按钮右边的向下三角形按钮。
3、编码方式(Encoding)选择UTF-8。
4、行尾(Line Endings)选择Windows(CR LF)。
其他参考资料:
1、行尾标准化:
http://www.cnblogs.com/liubiqu/archive/2009/01/16/1376891.html

2、编码方式与C4819警告:
http://bbs.csdn.net/topics/390457909
https://social.msdn.microsoft.com/Forums/vstudio/en-US/94153c9d-64ad-4f41-848c-c96b359e4542/unicode-error?forum=vcgeneral

作者参考的原文链接:https://blog.csdn.net/lsldd/article/details/46049481


未解决的测试问题:

除此之外,还遇到了一个问题,就是测试的大部分代码都没问题,但是有个程序的alloc就报内存错误。

#include <math.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_spline.h>
#include <conio.h>

int main(void)
{
	int i;
	double xi, yi, x[10], y[10];
	printf("#m=0,S=2\n");
	for (i = 0; i < 10; i++)
	{
		x[i] = i + 0.5 * sin(1.0*i);
		y[i] = i + cos(i * i*1.0);
		printf("%g %g\n", x[i], y[i]);
	}
	printf("#m=1,S=0\n");

	{
		gsl_interp_accel *acc = gsl_interp_accel_alloc();								 
		gsl_spline *spline = gsl_spline_alloc(gsl_interp_cspline, 10);
		gsl_spline_init(spline, x, y, 10);

		for (xi = x[0]; xi < x[9]; xi += 0.01)
		{
			yi = gsl_spline_eval(spline, xi, acc);//求x=xi时对应的插值yi。
			printf("%g %g\n", xi, yi);
		}

		gsl_spline_free(spline);
		gsl_interp_accel_free(acc);

	}
	system("pause");
	return 0;
}

在gsl_spline *spline = gsl_spline_alloc(gsl_interp_cspline, 10);行,会有内存错误。
在这里插入图片描述
不知道什么原因,目前网上也有人遇到过这个问题,可能不是同一个函数,但是最后均无解。网上有人建议崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。以我目前的水平还不知道该怎么看,如果有人能正确运行程序或者有解决办法,联系我哦~ 现在已经解决。我用同事发给我的gsl库就可以全部正常运行。说明是因为库不正确,同事给我的gsl库是老版本的,不是官网现在的新版本。我已经把直接可用的gsl库上传至我的csdn资源下载里面了。有需要的自己拿。没有积分的可以私我发给你。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值