费了一整天,研究vc2005下的clapack。。
各种错误,各种尝试。最后明白,不放弃是王道!
参考了Kaien 和
做了些改动,要不然不好使啊。。
////////////////////以下初始工作///////////////////////////
我的配置:
VS2005 和 CLAPACK版本: 3.1.1
下载解压后,我们可以看到如下目录结构:
\SRC
\BLAS
\F2CLIBS
\LIB
\INCLUDE
\TESTING
\INSTALL
这里我要提醒大家。虽然软件包里已经有编译好的.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.
这里需要注意的是,不同模式间不要混合使用。如下表:
Configuration | F2c | Reference BLAS | CLAPACK | CBLASWRAP | F77BLASWRAP | TMGLIB |
Win32 - Release | ||||||
Win32 - Release no wrap | |
|
|
|||
Win32 - Debug | ||||||
Win32 - Debug no wrap | |
|
|
////////////////////以上编译工作///////////////////////////
////////////////////以下如何调用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///////////////////////////
////////////////////以下一波未平,一波又起///////////////////////////
////////////////////以上一波未平,一波又起///////////////////////////
////////////////////以下是代码///////////////////////////
代码:
#include <stdio.h>
#include <process.h>
//因为程序是C++,而CLAPACK是f2c程序转换的C语言版本,所以在此处用extern关键字调用
extern"C"
{
#include <f2c.h>
#include <clapack.h>
}
#define SIZE 4
int main()
{
}