CLAPACK动态调用

http://blog.csdn.net/silyvin/article/details/9104463

在VS中用CLAPACK解决广义特征值问题

中介绍了CLAPACK静态链接库,供C++调用,这里再介绍以DLL形式完成调用的方式。


打开解决方案,在项目lapack中寻找dggev_,确认该函数

修改项目——属性——常规——配置类型——动态库(.dll)

属性——c/c++——代码生成——我这里用MTd,避免运行库在其他机器上缺失,在此过程中可能需要首先编译blas、f2c、tmglib为静态链接库以供lapack链接

出现链接错误,暴力忽略——属性——链接——输入——忽略库libcmtd.lib


还需要一个导出函数的声明


右键项目,新建一个def文件,写入:

LIBRARY    "lapack"
EXPORTS  
    dggev_ @ 1  


设置dll的导出函数。


在主调项目中,

属性——链接器——输入——附加依赖性:libf2cd.lib blasd.lib lapackd.lib tmglibd.lib  ——  全部删除

属性——链接器——常规——附加库目录:可删除

extern "C" int dggev_(char *jobvl, char *jobvr, integer *n, doublereal *  
                            a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar,   
                            doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl,   
                            doublereal *vr, integer *ldvr, doublereal *work, integer *lwork,   
                            integer *info);  

此段声明亦删除 ,虽然不进行调用不会造成链接错误。


然后用动态调用方式调用dll中函数,

	HMODULE hHandleLapack = LoadLibrary("lapack.dll");
	PDGGEV pDGGEV = (PDGGEV)GetProcAddress(hHandleLapack, "dggev_");

//	dggev_(&JOBU, &JOBVT, &N, &tempA[0], &N, &tempB[0], &N, alphar, alphai, beta, vl, &N, vr, &N,wk, &LWORK, &INFO);
	pDGGEV(&JOBU, &JOBVT, &N, &tempA[0], &N, &tempB[0], &N, alphar, alphai, beta, vl, &N, vr, &N,wk, &LWORK, &INFO);

	FreeLibrary(hHandleLapack);

PDGGEV pDGGEV = (PDGGEV)GetProcAddress(hHandleLapack, "dggev_");

也可以:

PDGGEV pDGGEV = (PDGGEV)GetProcAddress(hHandleLapack, "1");

posted on 2014-04-17 23:40  silyvin  阅读(267)  评论(0编辑  收藏  举报