CLAPACK动态调用

16 篇文章 0 订阅
9 篇文章 1 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值