我的工作很简单,就是想让 GSL 能够正常的在 windows 下工作。
最简单的一种方法就是 安装 Cygwin, Cygwin 中已经自带了一套编译好了的 GSL.
第二种方法就是在 windows 下用 gcc (MinGW) 编译 GSL, 当然还要安装 MSYS, MSYS 提供了 windows 下仿 unix 的环境,提供了 configure 工具,可以像在 unix 下那样生成 makefile , 然后 make 就行了,默认的静态库和动态连接库都会提供,我试了一下,应该没有问题(因为编译时间很长,我中途就中止了)。
第三种方法最麻烦,就是自己分析 GSL 源代码,然后用自己熟悉的工具(gcc/vc/c++builder/lcc..随你意)自己去编译。 当然这里说的分析并不是要去读懂每一句代码,我们只要明白每个文件向要做什么和大体上他要怎么做就足够了。
下面的文章主要是说一下第三种方法。我用的 GSL 版本是 1.8 。
GSL 中有个头文件 config.h 很重要,但是它是在 ./configure 过程中生成的。而 acconfig.h 就是它的模板。
看一下 acconfig.h 我们就知道了它主要定义了许多的环境变量,像 HAVE_INLINE、EXIT_SUCCESS、HAVE_DECL_EXPM1 等。也就是说如果你希望编译 GSL 时使用 inline 函数(使用inline 函数会提高代码运行速度,但是会增大代码体积,具体的可以参考 C 语言教材),那你就要用:
#define HAVE_INLINE 1
专业一些的术语来说,HAVE_INLINE 是一个开关,上面的语句打开了这个开关。
而 HAVE_DECL_EXPM1 是问你你的编译器提供的函数库是否带有 expm1() 函数。如果有的话就打开这个开关。
这许多的问题就靠你来通过阅读你使用的编译器提供的文档来找答案了。
我偷了些懒,直接用了 MSYS 提供的configure 就搞定了。不过这样生成的 config.h 只适用于 MinGW 对别的编译器可能会出现问题,好在问题不会很严重,无非就是编译器没有提供的函数 config.h 却说它提供了。编译的时候出了这种问题一般都很好发现,到时候再改也来得及。
在gsl-1.8 目录中有许多 子目录和几个头文件,先看这几个头文件(有几个不是头文件):
acconfig.h
config.h
gsl_machine.h(提供了各种机器常数)
gsl_math.h (提供了各种数学常数)
gsl_mode.h
gsl_nan.h(提供了浮点数中的 NaN 等)
gsl_pow_int.h (提供了 pow 函数的 inline 实现方式,相当于 Fortran 中的 ** )
gsl_precision.h
gsl_types.h(关于 Dll 的一些东西,定义了 GSL_VAR 这个宏)
gsl_version.h(版本信息)
gsl-histogram.c(一个测试例子,可以不管)
gsl-randist.c(一个测试例子,可以不管)
templates_off.h
templates_on.h(一些宏定义)
version.c(一个全局变量)
好了,根目录基本搞明白了。下面进入正式工作,首先从 sys 目录开始。这个目录中提供的许多函数在其他的目录中被广泛的使用。
进入这个目录,随便看几个源文件就会看到类似这样的语句:
#include <gsl/gsl_types.h>
说明头文件应该在 gsl 目录中。可是看一下 gsl目录发现它是空的。原因是在make的时候会将散落在各处的 头文件复制到 gsl 目录中,这个工作现在需要我们手动了。
将 gsl_sys.h 移动到 gsl 目录中。
我用的IDE 环境是 Dev_C 当然也可以用 VC。建一个空的工程(static lib)。为了好管理可以建立一个虚拟目录sys(VC中也有这个功能),把 sys中的文件都添加到 sys 中。
一个一个得编译。编译到 expm1.c 时报错,没有gsl/gsl_math.h 文件,这个文件已经介绍过了,添加到 gsl 目录,顺便将前面介绍过的头文件都拷贝过来。
编译,还有问题,是 inline 的问题,C 语言默认的没有 inline 函数。gcc 有个选项可以支持 inline,VC 就不那么顺利了。搞了半天也没搞定。当然有一种笨方法就是把文件后缀改成 cpp 不过函数声明还要加上 extern "C" ,太麻烦了,应该还有好方法,暂时还搞不定。
或者把 config.h 中的 HAVE_INLINE 去掉。 sys 目录就这样全搞定了。下面来说说这个目录里都是些什么东东。
log1p.c
gsl_log1p :/log(1+x)
expm1.c
gsl_expm1 :/exp(x)-1
hypot.c
gsl_hypot :/sqrt{x^2 + y^2}
invhyp.c
gsl_acosh :/arccosh(x)
gsl_asinh :/arcsinh(x)
gsl_atanh :/arctanh(x)
ldfrexp.c
gsl_ldexp :x * 2^e
gsl_frexp :splits the number x into its normalized fraction f and exponent e
pow_int.c
gsl_pow_2
gsl_pow_3
gsl_pow_4
gsl_pow_5
gsl_pow_6
gsl_pow_7
gsl_pow_8
gsl_pow_9
gsl_pow_int : x^n
coerce.c
好像没什么用...
fcmp.c
比较 x y 是否接近。
fdiv.c
除法
infnan.c
产生、测试特殊的浮点数,如 NaN 等。
minmax.c
比较大小的一些函数。
prec.h
定义了一些常量
/////////////////////
近来帮朋友编译一个SIFT匹配的程序,可是里面不仅用到了OpenCV,而且用到了GSL,但是在编译的过程中,OpenCV的配置是没有什么问题了,可是GSL一直不行,在用VC6.0进行编译的时候,总是出现类似与如下的错误:
xform.obj : error LNK2001: unresolved external symbol _gsl_rng_free
xform.obj : error LNK2001: unresolved external symbol _gsl_rng_set
xform.obj : error LNK2001: unresolved external symbol _gsl_rng_alloc
xform.obj : error LNK2001: unresolved external symbol _gsl_rng_mt19937
xform.obj : error LNK2001: unresolved external symbol _gsl_sf_choose
xform.obj : error LNK2001: unresolved external symbol _gsl_rng_uniform_int
一想既然是LINK时的错误,肯定是lib文件有关系了。看到GSL的lib文件夹下面并没有后缀名为lib的文 件。但是又看到有后缀名为def的文件,我知道通过def文件是可以导出dll和lib文件的了。而且在网络上也看到可以用VS的lib命令来导出适合 VS用的.lib文件,于是打开cmd窗口。
D:/Program Files/GnuWin32/lib>lib /machine:i386 /def:libgsl.def
Microsoft (R) Library Manager Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Creating library libgsl.lib and object libgsl.exp
D:/Program Files/GnuWin32/lib>lib /machine:i386 /def:libgslcblas.def
Microsoft (R) Library Manager Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Creating library libgslcblas.lib and object libgslcblas.exp
D:/Program Files/GnuWin32/lib>
可以看到lib文件夹下已经有了libgsl.lib和libgslcblas.lib这样的话,我们只要将这两个lib文件添加到工程Link页中就可以了,如下:
当然了,要用GSL的话,也需要在VC的目录中添加GSL的include目录、lib目录和bin目录,如下:
从添加的Include目录可以看出,当你用GSL里面的头文件时,需要类似与这样的引用:
#include <gsl/gsl_rng.h>当然,如果你在添加Include目录是添加的是:D:/Program Files/GnuWin32/include/gsl
那么就不需要前面的gsl,只要如此引用就可以了:#include <gsl_rng.h>
还有一点需要说明的是GSL中已经没有gsl_rng_free.h了,所以你需将其改为gsl_rng.h
你可以在这里下载这个经典SIFT的图像匹配程序的VC程序:
http://download.csdn.net/source/1352136
你可以在这里下载GSL(GNU Scientific Library)1.8:
http://download.csdn.net/source/1352070
The GNU Scientific Library(GSL) is a numerical library for C and C++ programmers. It is free software under the GNU General Public License.The library provides a wide range of mathematical routines such as random number generators, special functions and least-squares fitting. There are over 1000 functions in total with an extensive test suite.
以下是详细介绍如何在 Visual C++ 6.0 的 IDE 下使用︰
1. 首先到 http://gnuwin32.sourceforge.net/packages/gsl.htm下载Binaries、Developer files 。
2. 将 Binaries package 內 bin 子目录下的 libgsl.dll, libgslcblas.dll 两个文件复到 C:/Windows/System32 中。
3. 将 Developer files 解压缩后,把 include, lib 目录复制到 VC 的 IDE 的目录中,直接覆盖 include, lib 目录即可。
4. 由于此版本的 lib 子目錄中不含 .lib 文件,必須用以下命令产生。 先进入DOS窗口,切换到 VC 的 IDE下的lib 目录下,输入以下命令︰
lib /machine:i386 /def:libgsl.def
lib /machine:i386 /def:libgslcblas.def
即可产生 libgsl.lib, libgslcblas.lib 两个文件。
5. 在 VC IDE 环境中加入 libgsl.lib, libgslcblas.lib 这2个 lib 到 link 参数中。
May be there is still some problem with GSL in this way to install!
http://blog.chinaunix.net/u/22751/showart.php?id=272462
http://www.gnu.org/software/gsl/manual/html_node/
以下是测试文件
#include <stdio .h>
#include <gsl /gsl_sf_bessel.h>
int main (void)
{
double x = 5.0;
double y = gsl_sf_bessel_J0(x);
printf ("J0(%g) = %.18en", x, y);
return 0;
}
1. 下载GNU Win32开发包
http://gnuwin32.sourceforge.net/packages/gsl.htm
2. 找到安装目录
关注下面的几个文件夹中的文件
/bin/
gsl-histogram.exe 用于计算数据直方图的程序
gsl-randist.exe 用于生成服从指定分布数据的程序
libgsl.dll gsl动态库函数
libgslcblas.dll gsl动态库函数
将后面的两个文件拷贝到VC98/bin下
/include/gsl
这个目录里面是所需要的头文件,将整个目录拷贝到VC98/include/下
/lib/
libgsl.a gcc标准静态库文件
libgsl.def
libgsl.dll.a
libgslcblas.a gcc标准静态库文件
libgslcblas.def
libgslcblas.dll.a
将gcc标准静态库文件拷贝到VC98/lib/下
3. 修改工程设置(ALT+F7)Link选项卡,在末尾加入静态库文件libgsl.a libgslcblas.a
4. 编译帮助中的示例代码计算贝塞尔函数的值即可
#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>
int main (void)
{
double x = 5.0;
double y = gsl_sf_bessel_J0 (x);
printf ("J0(%g) = %.18e/n", x, y);
return 0;
}
返回:
J0(5) = -1.775967713143382600e-001
参考:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/iamoyjj/archive/2009/11/12/4800910.aspx