【问题标题】:Compiling lapacke example code?编译 lapacke 示例代码?
【发布时间】:2014-03-20 17:59:04
【问题描述】:

我正在尝试编译此处找到的示例:

http://www.netlib.org/lapack/lapacke.html#_examples

具体来说,我正在尝试让“调用 CGEQRF 和 CBLAS”示例正常工作。代码是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <lapacke.h>
#include <cblas.h>

int main (int argc, const char * argv[])
{
 lapack_complex_float *a,*tau,*r,one,zero;
 lapack_int info,m,n,lda;
 int i,j;
 float err=0.0;
 m = 10;   n = 5;   lda = m;
 one = lapack_make_complex_float(1.0,0.0);
 zero= lapack_make_complex_float(0.0,0.0);
 a = calloc(m*n,sizeof(lapack_complex_float));
 r = calloc(n*n,sizeof(lapack_complex_float));
 tau = calloc(m,sizeof(lapack_complex_float));
 for(j=0;j<n;j++)
    for(i=0;i<m;i++)
       a[i+j*m] = lapack_make_complex_float(i+1,j+1);
 info = LAPACKE_cgeqrf(LAPACK_COL_MAJOR,m,n,a,lda,tau);
 info = LAPACKE_cungqr(LAPACK_COL_MAJOR,m,n,n,a,lda,tau);
 for(j=0;j<n;j++)
    for(i=0;i<n;i++)
       r[i+j*n]=(i==j)?-one:zero;
 cblas_cgemm(CblasColMajor,CblasConjTrans,CblasNoTrans,
           n,n,m,&one,a,lda,a,lda,&one,r,n );
 for(i=0;i<n;i++)
    for(j=0;j<n;j++)
       err=MAX(err,cabs(r[i+j*n]));
 printf("error=%e\n",err);
 free(tau);
 free(r);
 free(a);
 return(info);
} 

如果我将文件保存为 .cpp(也许这是我的第一个错误?)并使用

进行编译
g++ lapacketest.cpp -llapack 

我得到以下编译错误:

3_20_2.cpp:14:7:错误:从不兼容的类型“void *”分配给“_Complex float *” a = calloc(m*n,sizeof(lapack_complex_float)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3_20_2.cpp:15:7:错误:从不兼容的类型“void *”分配给“_Complex float *” r = calloc(n*n,sizeof(lapack_complex_float)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3_20_2.cpp:16:9:错误:从不兼容的类型“void *”分配给“_Complex float *” tau = calloc(m,sizeof(lapack_complex_float)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3_20_2.cpp:29:25:错误:使用未声明的标识符“cabs” 错误=MAX(错误,cabs(r[i+j*n]));

我尝试更改为 .c 并使用 gcc 进行编译,但出现了其他奇怪的错误。有什么想法吗?我正在慢慢尝试从 Matlab 过渡到 c++ 以进行科学计算,到目前为止,这只是一个令人头疼的问题。

【问题讨论】:

    标签: c++ c lapack


    【解决方案1】:

    看起来calloc(m*n,sizeof(lapack_complex_float)); 没有返回指向lapack_complex_float 类型对象的指针。

    【讨论】:

    • 好的。我该怎么办...?
    • 你能确认是这样吗? calloc 实际上返回的是什么?看起来它正在返回void,这没什么。你需要一些东西来返回指向lapack_complex_float的指针。
    • 好的,分配问题似乎已通过类型转换a = (lapack_complex_float*) calloc(...) 解决。但现在我收到“架构 x86_64 的未定义符号”错误......示例代码显然不应该按原样运行......或者我不知道我在做什么......
    【解决方案2】:

    我可以编译它,但你必须改变行

    #include <lapacke.h> 
    

    #include &lt;lapacke_utils.h&gt;

    您可以在http://www.netlib.org/lapack/explore-html/da/d8e/lapacke__utils_8h_source.html 找到。在你下载它并放在你的程序的同一目录或使用标签-L -I在编译期间在你的系统上定位库之后。

    编译使用:

    gcc CGEQRF_CUNGQR.c -llapacke -lblas -lm
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2017-06-25
      • 2012-04-14
      相关资源
      最近更新 更多