博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CLAPACK动态调用
阅读量:4080 次
发布时间:2019-05-25

本文共 1421 字,大约阅读时间需要 4 分钟。

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

中介绍了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");

你可能感兴趣的文章