lapack 动态链接库的使用示例

时间:2021-04-04 08:42:50

   LAPACK,其名为Linear Algebra PACKage的缩写,是Oak Ridge 国家实验室、加州大学Davis分校和Illinois大学联合开发的线性代数函数库,用于在不同高性能计算环境上高效求解数值线性代数问题,是以Fortran编程语言编写。LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。
   C语言版本的lapack主页在[http://www.netlib.org/clapack/],不过单从使用的角度来看,还是不够方便,它提供了全部的源代码,要使用的时候先必须编译出lib文件。问题在于,很多用户下载下来以后,编译都不成功。幸亏有好心人将lapack制作了dll文件,省略了不少麻烦。现在介绍一下如何使用dll版本的lapack。
1) 下载dll及头文件
   进入链接 [http://www.fi.muni.cz/~xsvobod2/misc/lapack/],dll文件下载 shared version那个版本(我下的是shared version (statically-linked, release):),头文件则位于页面的最下面的“gzipped header files”。
2)vs2005 新建windows console项目,代码如下:
//// eigvector.cpp : Defines the entry point for the console application.
////

#include "stdafx.h"

#include <iostream>
#include <string>
using namespace std;

 

//注意我下的是 shared version (statically-linked, release):这个版本!

//其他版本,下面两句是不同的

#pragma comment(lib, "lapack_win32_MT.lib")
#pragma comment(lib, "blas_win32_MT.lib")


extern "C" {
#include <f2c.h>
#include <sgesv.h>
}


int _tmain(int argc, _TCHAR* argv[])
{
    integer  M=3 ;
    integer  N=1;
    real a[9]={4,3,11,2,-1,0,-1,2,3};
    real b[3]={2,10,8};
    integer lda;
    integer ldb;
    integer INFO;

    lda=M;
    ldb=M;
    integer *ipiv;
    ipiv = (integer *)new integer[M];

    sgesv_(&M, &N, a, &lda,ipiv, b, &ldb, &INFO);

    if(INFO==0)
    {
        for(int i=0; i<M; i++)
        {    
            cout<<b[i]<<endl;
        }
    }
    else
    {
        cout<<"Failed."<<endl;
    } 

    return 0;
}
3) f2c.h是公用头文件,里面typedef了很多数据类型以及一些struct。sgesv_是解线性方程的一个函数,所以必须
加上它的头文件sgesv.h。这个时候编译,肯定出问题了,环境还没配置好嘛。将shared-lib.zip解压,可以看到里
面有blas和lapack的lib和dll文件;将headers.tar.gz解压,理由有blas和lapack两个文件夹,分别含有各自的头
文件。在c盘下新建folder,取名lapack, 里面新建两个folder, 分别为include和lib。把lapack和blas文件夹放在
include下面,把lib文件放在lib文件夹下面。tool->options->projects and solutions->VC++ Directories,
找到show directories for, 分别为Include files和Library files添加刚才新建的include文件夹和lib文件夹的路径(include files: C:/lapack/include/blas C:/lapack/include/lapack  以及 Library files:C:/lapack/lib)在debug模式下编译执行,还是报错!!!说dll文件找不到,把shared-lib.zip解压出来的两个dll文件放到
你的project下面的debug下,就没问题了。输出结果为-14,56,54,是不是一样的呢?

 

欢迎各位交流  shaolongchou@126.com