|
Project Information
Featured
|
缘起这是GSL的VS2008的移植版。移植过程中参考了WinGsl的代码。之所以重新移植这个库,是因为: - WinGsl是版本比较老的GSL的移植版,缺乏GSL的一些最新的特性;
- 我刚开始使用WinGsl的时候遇到了一些问题。这些问题不是WinGsl所固有的,应该是我在工程设置上的错误。原来的文档比较少,加之网上搜来的资料又往往人云亦云,以讹传讹,所以我不得不试着从理解代码着手去解决这些问题。这些困难促使我自行去移植了GSL。(参考了WinGsl中的一些代码)
GSL介绍顾名思义,GSL(GNU Scientific Library)是一个科学研究用的代码库,包含如下一些特性: - 大随机数生成;
- FFT、DF
- 复数表示,及其基本运算
- 排列组合
- 线性代数
- ...
更详细的介绍,在GSL的官网上可以看到http://www.gnu.org/s/gsl/ 修改日志对于官方GSL的最新版本(1.15),我作了如下一些改动(下面的描述中,src是GSL代码的根目录): - 在Linux下(Fedora 13),执行./configure以产生config.h文件,然后把产生的整个代码包复制到Windows下(GSL中的configure脚本还把一些声明了API函数的头文件复制到了src/gsl目录下)。然后按照WinGsl对config.h进行了一些更改:添加了complex宏的处理(如果不加,会产生一些奇怪的问题,估计是在VS2008下,代码中的complex与C++的STL中的名称发生了冲突),HAVE_宏依照VS2008的特性进行了定义;
- 在VS2008中,建立静态库工程(注:0.3版本已经添加了动态库),然后把GSL代码包中所有的.c文件添加到工程中。需要注意的是,代码中某些文件是测试用的,它们的名字往往是test*.c,这些文件不要添加进来。此外,GSL代码中为了实现类似C++的模板机制,使用了大量类似#include <*.c>的包含方式,假设file1.c中include了file2.c,那么同时把file1.c和file2.c添加到工程中,会引起某些函数重新定义的错误(实际上发生的往往是file2.c中的某些符号未定义的错误,因为file1.c中往往会在include file2.c之前include某些头文件,而file2.c中没有包含这些头文件,造成符号未定义的错误)。这种情况下,就要把file2.c从工程中移除(在GSL中,这些文件的文件名往往以_source结尾)。
- 此外,在VS2008下,动态库中的函数的声明方式与GCC下不同,因此,在src/gsl_types.h添加了一个宏GSL_API,这个宏在动态库的情况下,定义为declspec(dllexport),然后在GSL中所有API函数的声明前,添加了GSL_API宏。
本版本的代码是针对VS2008的,如果你使用的是VS的其它版本,理论上不需要修改代码,(如果是VS的较早版本)你只需要按照上面第二步,创建工程文件和添加源文件就行了(这是一件体力活:( ,我花了大半天时间来折腾)。 文件目录说明- build VS2008的工程文件在此目录下
- 3rd-party GSL的代码在此目录下
- out 编译产生的文件在此目录下,包括两个目录include和lib,include中是头文件(与WinGsl的不同在于,所有函数对应的头文件需要自行查找的。这是需要改进的地方),lib中是静态库。
补充如果使用上存在什么问题,或者小白们作了一些尝试有些什么心得,欢迎邮件骚扰本人。不过我不是一天看邮箱四五次的勤快人,如果没有及时回复邮件,那就抱歉了,先向诸位说声对不起。
|