VS2005下CLAPACK的安装(批注版)

原文地址:http://archive.cnblogs.com/a/1982384/


本人对以上内容做一些补充与批注。



以下初始工作///

我的配置:

VS2005 和 CLAPACK版本: 3.1.1

下载解压后,我们可以看到如下目录结构:
\SRC             CLAPACK的源代码
\BLAS            BLAS的源代码
\F2CLIBS       F2C的源代码

\LIB                 编译后的库文件.lib
\INCLUDE       头文件
\TESTING       一些使用范例程序
\INSTALL        里面有UNIX和其他平台下安装的文件和方法。lawn81.pdf文件是CLAPACK的使用说明,大家使用的时候可以看看。

 

这里我要提醒大家。虽然软件包里已经有编译好的.lib文件,就在\LIB中。但是我建议大家不要直接使用他们,还是自己编译一下再用才保险。

很多人就是因为直接使用他们而出错的。这点非常重要!如果你就是直接调用他们失败的,那不妨先自己编译一下再试试。

注意,\LIB\Win32下已经有一些lib了。大家最好把他们都先删除了,以免新旧文件混淆。

以上初始工作///

 

以下编译工作///

我们根据个人需要,编译成debug模式,或者release模式。我这里就以release模式为例说明。因为release快得多!我的系统是win32。如果你是64位系统也是支持的,操作方法类似。【本人:确实快的不是一点点,如果很在意效率一定要使用release版】

我们要的是:Win32 - Release。不要那个Win32 - Release no wrap。

首先编译F2CLIBS,用于将fortran转换为c语言。
选择libf2c子项目。直接生成之。编译过程中可能会有一些warning,不要理会他们。编译成功后,输出文件是libf2c.lib。

接着编译tmglib。这是一个矩阵库。
这个库在TESTING\MATGEN里面。选择他生成就好了。
输出文件还是在\LIB里面。文件名是tmglib.lib。


然后是编译blas(注意小写),选择项目blas, 编译之。输出文件BLASd.lib。

最后是编译CLAPACK,生成clapack.lib.

【本人:还有

f77blaswrap.lib

cblaswrap.lib

也需要生成,这两个需要的原因是,在你使用lapack过程中不可避免的要使用一些简单的矩阵运算,如果使用自己的写法,效率也会被拖慢,包含这两个库,可以调用blas

 

这里需要注意的是,不同模式间不要混合使用。如下表:Win 32

 

ConfigurationF2cReference BLASCLAPACKCBLASWRAPF77BLASWRAPTMGLIB
Win32 - Release

libf2c.lib

BLAS.lib

clapack.lib

cblaswrap.lib

f77blaswrap.lib

tmglib.lib

Win32 - Release no wrap

 

BLAS_nowrap.lib

clapack_nowrap.lib

 

 

tmglib_nowrap.lib

Win32 - Debug

libf2cd.lib

BLASd.lib

clapackd.lib

cblaswrapd.lib

f77blaswrapd.lib

tmglibd.lib

Win32 - Debug no wrap

 

BLASd_nowrap.lib

clapackd_nowrap.lib

 

 

tmglibd_nowrap.lib

 

以上编译工作///

 

以下如何调用CLAPACK///

前面,我们已经生成了CLAPACK的库文件了。那么如何在自己的程序中使用他们呢?
其实很简单。你所需要的只有两部分:
1)头文件
头文件就是.h文件。存放在\INCLUDE中。在自己的工程里加入这个目录就行了。里面的文件最好不要作任何修改。程序中主要调用的头文件是clapack.h和f2c.h。还有一个头文件:blaswrap.h。共三个。

【本人:如果要使用blas,仅包含以上三个文件是不够的

2)库文件
库文件就是我们前面编译生成的那些lib文件了。

 

这里,我就以一个具体的MFC“文档/视”实例详细地说明如何在VC中设置和使用CLAPACK。
首先,VC中项目的设置方式是:
项目的属性里。C/C++选项卡中,附加包含目录里添加\INCLUDE目录。【需要增加附加包含目录,要多包含~\CLAPACK-3.1.1-VisualStudio\BLAS\WRAP, 才能使用blas】
连接器选项卡中。附加库目录里添加\LIB\Win32目录。

然后附加依赖项添加libf2c.lib BLAS.lib clapack.lib tmglib.lib。根据不同的编译模式和个人需要以及系统需要选择库文件。注意,前面这句话很重要。lib写多了不行,写少了也不行,顺序错了也不行,娘的。。比如,使用dgesvd_的那个例程,用到的附加依赖项lib是:clapack.lib
BLAS.lib libf2c.lib 不多不少,顺序也不能调啊!【最正确的顺序是:libf2c.lib BLAS.lib clapack.lib tmglib.lib cblaswrap.lib f77blaswrap.lib 这样可以同时使用clapack, cblas】

还有工程的一些设置,很重要!

 

在VC++IDE中选择Projects→settings→C/C++。

1)在category中选择Code Gfengeration,在Use run-time library中选择Debug Multithread 。(必须的)注意不是那个什么dll。

2)在category中选择Precompiled Headers,中选择Automatic use of precomplid headers,并且在Through header下面添加stdafx.h。(可省去)

3)在Category中选择Preprocessor,在Preprocessor definitions中添加 MSVC,MSWIND (可以省略)

 

在VC++IDE中选择Projects→settings→Link

在Categories中选择Input,在Ignore libraries中填入:msvcrt.lib(必须的)

以上如何调用CLAPACK///

 

以下一波未平,一波又起///

但是,当我试图将该库直接引用到我的C++工程的时候,用了相应的头文件lapack.h,我的程序立刻出现如下诸多错误。
 
......\clapack.h(3592) : error C2144: syntax error : 'char ' should be preceded by ') '
 
......\clapack.h(3592) : error C2144: syntax error : 'char ' should be preceded by '; '
 
......\clapack.h(3592) : error C2143: syntax error : missing '; ' before ', '
 
......\clapack.h(3592) : error C2059: syntax error : ', '
 
......\clapack.h(3592) : error C2059: syntax error : ') '
 
于是,我查头文件lapack.h(一行一行注释查哪里出错),发现以下两行注释掉之后,整个工程可以编译过,剩下只是链接问题。
 
int dlabad_(doublereal *small, doublereal *large);
 
and
 
int slabad_(real *small, real *large);
 
但是,注释掉这两行来让我的代码编过总感觉不爽。
后来发现,原来是因为:在NpcNdr.h中有#define small char,只要将small换个变量名就可以了。
如:int slabad_(real *small_cfl, real *large);

以上一波未平,一波又起///

 

以下是代码///

 

 

代码:
#include <stdio.h>
#include <process.h>

//因为程序是C++,而CLAPACK是f2c程序转换的C语言版本,所以在此处用extern关键字调用
extern"C"// this program is serving for clapack development, so it bases on the lib of clapck
{
#include <blaswrap.h> //红色部分做了修改,可以使用blas
#include <f2c.h>
#include <clapack.h>
#include <fblaswr.h>
#include <cblas.h>
}

#define SIZE 4

int main()
{
     char JOBU;
     char JOBVT;

     int i;

     //数据类型integer是fortran里的。这里在C++下可以使用的原因是f2c.h文件中已经作了定义
     integer M = SIZE;
     integer N = SIZE;
     integer LDA = M;
     integer LDU = M;
     integer LDVT = N;
     integer LWORK;
     integer INFO;
  
     integer mn = min( M, N );
   
     integer MN = max( M, N );
    
     double a[SIZE*SIZE] = { 16.0, 5.0, 9.0 , 4.0, 2.0, 11.0, 7.0 , 14.0, 3.0, 10.0, 6.0, 15.0, 13.0, 8.0, 12.0, 1.0};
     double s[SIZE];
     double wk[201];
     double uu[SIZE*SIZE];
     double vt[SIZE*SIZE];
    
       JOBU = 'A';
    
       JOBVT = 'A';
    
    LWORK = 201;
   

    dgesvd_( &JOBU, &JOBVT, &M, &N, a, &LDA, s, uu, &LDU, vt, &LDVT, wk, &LWORK, &INFO);
         
    printf("INFO=%d \n", INFO );         

    for ( i= 0; i< SIZE; i++ ) {
        printf("s[ %d ] = %f\n", i, s[ i ] );
    }

    system("pause");

    return 0;
   


调用blas的例程会再后文中给出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值