lapack++与sba的编译问题

本文详细介绍了如何在C++环境中调用C语言编写的SBA程序,并提供了将SBA程序与LAPACK++库成功集成的步骤。包括解决库冲突、配置环境变量、以及实现C++和C语言间函数调用的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在研究老外写的sba的程序,从http://users.ics.forth.gr/~lourakis/sba/下载的sba程序是源代码,并没有编译,按照http://blog.youkuaiyun.com/royalvane/article/details/8125388的方法,下载http://www.netlib.org/clapack/CLAPACK3-Windows.zip这个文件,并在vc6.0下编译是没有问题的,编译完成后,在文件中会找到clapack.lib ,blas.lib,libF77.lib,libI77.lib这四个库,将它们复制到sba目录下就能编译成功,sba程序运行是输命令行参数的,详细用法可以参照demo文件夹下的readme文档。sba程序是用c语言写的,有时候我们想要在c++中使用sba程序,我的做法是把源程序.c改成.cpp,然后将里面的分配动态数组的函数修改一下(动态数组的size很关键,一定要看清楚,不要设置错了),属性中包含的库目录也要设置好,这时候编译会出现很多问题,比如什么库冲突,还有转换到EOFF期间文件出错(这个问题可以将vs2010打上sp1补丁就可以解决),还有最大的问题就是出现了一堆没有定义的外部命令,这是因为在c++中调用c中编译的库会出现这样的问题,用extern “C”,如下:

#ifdef __cplusplus
extern "C" {
#endif
/* declarations of LAPACK routines employed */

/* QR decomposition */
extern int F77_FUNC(dgeqrf)(int *m, int *n, double *a, int *lda, double *tau, double *work, int *lwork, int *info);
extern int F77_FUNC(dorgqr)(int *m, int *n, int *k, double *a, int *lda, double *tau, double *work, int *lwork, int *info);

/* solution of triangular system */
extern int F77_FUNC(dtrtrs)(char *uplo, char *trans, char *diag, int *n, int *nrhs, double *a, int *lda, double *b, int *ldb, int *info);

/* Cholesky decomposition, linear system solution and matrix inversion */
extern int F77_FUNC(dpotf2)(char *uplo, int *n, double *a, int *lda, int *info); /* unblocked Cholesky */
extern int F77_FUNC(dpotrf)(char *uplo, int *n, double *a, int *lda, int *info); /* block version of dpotf2 */
extern int F77_FUNC(dpotrs)(char *uplo, int *n, int *nrhs, double *a, int *lda, double *b, int *ldb, int *info);
extern int F77_FUNC(dpotri)(char *uplo, int *n, double *a, int *lda, int *info);

/* LU decomposition, linear system solution and matrix inversion */
extern int F77_FUNC(dgetrf)(int *m, int *n, double *a, int *lda, int *ipiv, int *info); /* blocked LU */
extern int F77_FUNC(dgetf2)(int *m, int *n, double *a, int *lda, int *ipiv, int *info); /* unblocked LU */
extern int F77_FUNC(dgetrs)(char *trans, int *n, int *nrhs, double *a, int *lda, int *ipiv, double *b, int *ldb, int *info);
extern int F77_FUNC(dgetri)(int *n, double *a, int *lda, int *ipiv, double *work, int *lwork, int *info);

/* SVD */
extern int F77_FUNC(dgesvd)(char *jobu, char *jobvt, int *m, int *n,
           double *a, int *lda, double *s, double *u, int *ldu,
           double *vt, int *ldvt, double *work, int *lwork,
           int *info);

/* lapack 3.0 routine, faster than dgesvd() */
extern int F77_FUNC(dgesdd)(char *jobz, int *m, int *n, double *a, int *lda,
           double *s, double *u, int *ldu, double *vt, int *ldvt,
           double *work, int *lwork, int *iwork, int *info);


/* Bunch-Kaufman factorization of a real symmetric matrix A, solution of linear systems and matrix inverse */
extern int F77_FUNC(dsytrf)(char *uplo, int *n, double *a, int *lda, int *ipiv, double *work, int *lwork, int *info); /* blocked ver. */
extern int F77_FUNC(dsytrs)(char *uplo, int *n, int *nrhs, double *a, int *lda, int *ipiv, double *b, int *ldb, int *info);
extern int F77_FUNC(dsytri)(char *uplo, int *n, double *a, int *lda, int *ipiv, double *work, int *info);

#ifdef __cplusplus
}
#endif

这时候编译就能通过,并且此程序得到的结果与c中计算的结果一致。

如果有人想用lapack++,那可以在http://sourceforge.jp/projects/sfnet_lapackpp/下载,然后这个程序的编译又是一个难题,不过在程序根目录下有readme文件,仔细阅读,发现需要准备两个外部库文件,但是可以在http://sourceforge.jp/projects/sfnet_lapackpp/下载这个lapackpp-2.5.1-setup.exe程序并安装,这时候再去编译lapackpp源代码,设置好库目录就可以编译通过,关于库目录的问题,两个静态库在你刚刚安装的lapackpp-2.5.1-setup.exe目录下,我的是C:\Program Files\lapackpp\lib,还有一个动态库,在C:\Windows目录下,设置好后就可以编译成功了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值