转:vc2005下的clapack...吐血之作

费了一整天,研究vc2005下的clapack。。

各种错误,各种尝试。最后明白,不放弃是王道!

参考了Kaien 和  Kevin Wong。

做了些改动,要不然不好使啊。。

////////////////////以下初始工作///////////////////////////

我的配置:

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位系统也是支持的,操作方法类似。

我们要的是: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.

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

Win 32

Configuration F2c Reference BLAS CLAPACK CBLASWRAP F77BLASWRAP TMGLIB
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。共三个。

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

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

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

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

在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"
{
#include <f2c.h>
#include <clapack.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;
}

时间: 2024-10-29 19:10:37

转:vc2005下的clapack...吐血之作的相关文章

天 下 难 事 , 必 作 于 易 , 天 下 大 事 , 必 作 于 细 -道德经的哲学

<道德经>--<老子道德经> 老 子: 「道 德 經」: 第 一 章 道 可 道 , 非 常 道 . 名 可 名 , 非 常 名 . 无 名 天 地 之 始 ﹔ 有 名 万 物 之 母 . 故 常 无 , 欲 以 观 其 妙 ﹔ 常 有 , 欲 以 观 其 徼 . 此 两 者 , 同 出 而 异 名 , 同 谓 之 玄 . 玄 之 又 玄 , 众 妙 之 门 . 老 子: 「道 德 經」 : 第 二 章 天 下 皆 知 美 之 为 美 , 斯 恶 已 . 皆 知 善 之 为 善 ,

Java内部类总结 (吐血之作)

内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限).内部类主要有以下几类:成员内部类.局部内部类.静态内部类.匿名内部类 为什么需要内部类? 典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象.所以你可以认为内部类提供了某种进入其外围类的窗口.使用内部类最吸引人的原因是: 每个内部类都能独立地继承自一个(接口的

第12课:HA下的Spark集群工作机制解密

Spark HA需要先安装zookeeper,推荐稳定版zookeeper-3.4.6,具体安装如下: 1) 下载Zookeeper 进入http://www.apache.org/dyn/closer.cgi/zookeeper/,你可以选择其他镜像网址去下载,用官网推荐的镜像:http://mirror.bit.edu.cn/apache/zookeeper/ 下载zookeeper-3.4.6.tar.gz.  2) 安装Zookeeper 提示:下面的步骤发生在master服务器. 以u

Java 中内部类特性总结(吐血之作)

PS:今天花了整个下午时间看内部类相关的内容,因知识点多而杂,故记之如下. 一.内部类的作用 内部类看起来是一种代码隐藏机制:将类置于其他类的内部.它还了解外部类,并能与之通信:使用内部类可以实现闭包:内部类与接口使得多继承更完整,并且内部类是一个独立的实体(没有 is-a,仅仅是方法的封装). 二.基本特性 1)普通内部类为类的实例相关,可以看成是一个实例变量.内部类的类名由 "外部类.内部类" 确定. 内部类可以直接访问外部类的所有成员(包括 private成员),隐式或显式(外部

NHibernate 的 SetResultTransformer 方法在Oracle下的Bug修复

NHibernate 的 SetResultTransformer 方法在Oracle下会出现"Could not find a setter for property"错误,这是Nhibernate在Oracle下使用的一个Bug.针对此Bug我可以自己进行修复. 下载NHibernate源码,将Property下的"ChainedPropertyAccessor.cs"稍作修改就会修复此Bug,代码如下: using System; namespace NHib

MVVM模式下如何使用ReactiveCocoa响应链式编程&lt;一&gt;

前一阵子公司要求项目从新架构,但又只给不到一个月的时间,这显然是不可能的.但从新架构又是在所难免的,和同事商定后决定一部分交互逻辑比较少的界面先使用MVVM架构,然后慢慢修改.下面整理了一下这次重构的遇到的问题,并希望能给大家一些帮助. 1.ReactiveCocoa的使用 要使用MVVM模式编程收下选择一个框架,当然不仅仅是ReactiveCocoa这一个框架,这里就不多说.当然我也没用过别的,如果哪位看官用过可以多多指教.接下来我就按步骤说了: 第一步:导入ReactiveCocoa框架,建

运维侠客行杭州站沙龙回顾 | 云时代下的运维管理实践

我们处在一个巨变的时代,在云计算.大数据和物联网等新技术.新理念不断更新的大背景下,企业同时面临着数字化和"互联网+"转型的双重挑战,企业对于"稳态IT"和"敏态IT"都提出了强烈的需求,如何推进双态环境下的技术演进变成全行业共同面临的难题. 在这样一个"时空交错"中,优云软件推出了一个名为:"运维侠客行"的线下沙龙品牌,杭州作为首站,活动当天汇聚了来自不同行业和企业的运维从业人员,其中有几十年的运维老兵,

课下参考四 linux的ssh服务实现多用户登录linux系统--windows客户端篇

********************************************** 本教程使用windows做为客户端,登录centos6.7系统. ssh客户端软件为SecureCRT7.1 ********************************************** 1.利用SecureCRT生成ssh公钥(RSA) 第一步:密钥对的生成. 在SecureCRT中建立一个新的连接. protocol选ssh2 hostname输入要连接的主机IP. Port输入目标

几种系统下查看FC HBA卡信息的方法

几种系统下查看FC HBA卡信息的方法 目  录 几种系统下查看FC HBA卡信息的方法 FC HBA卡概述 Windows系统下查看FC HBA卡的信息 Linux系统下查看FC HBA卡的信息 UNIX系统下查看FC HBA卡的信息 在不同的操作系统中,查看FC HBA卡信息的方法各有不同,本文就在Windows.Linux.IBM AIX.SUN Solaris.HP-UX系统下如何查看FC HBA卡的信息作了介绍,供实施相关项目时参考. 在配置磁盘阵列.虚拟带库以及其他带FC HBA卡的