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");