Lapack未定义参考

时间:2012-04-04 20:58:07

标签: g++ lapack

我是g ++和lapack的新手,并尝试使用它们。我尝试编译以下天真代码时遇到了问题

#include <lapackpp.h>
int main()
{
    LaGenMatDouble A;
    return 0;
}

如果我运行命令

$g++ -L/usr/local/lib -llapackpp test2.cpp 

其中test2.cpp是cpp文件的名称,终端会给出错误:

test2.cpp:1:22: fatal error: lapackpp.h: No such file or directory

但是如果我运行命令:

$g++ -I/usr/local/include/lapackpp -L/usr/local/lib -llapackpp test2.cpp

终端会出错:

/tmp/ccUi11DG.o: In function `main':  
test2.cpp:(.text+0x12): undefined reference to `LaGenMatDouble::LaGenMatDouble()'  
test2.cpp:(.text+0x23): undefined reference to `LaGenMatDouble::~LaGenMatDouble()'  
collect2: ld returned 1 exit status

BTW,如果我运行命令

$pkg-config lapackpp --libs

结果是

-L/usr/local/lib -llapackpp 

你能帮我解决一下吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

Lapack需要fortran库,因此这是-lgfortran来自的地方。此外,似乎为编译器提供该库的确切方法取决于Linux发行版。来自documentation

  

要求

     

这个包需要包“blas”,“lapack”(没有“++”)和Fortran编译器。在大多数Linux上,这些都可以作为预编译的二进制文件使用,名称为“blas”和“lapack”。对于SuSE 10.x,Fortran编译器以“gfortran”包的形式提供。对于SuSE 9.x,Fortran编译器以“gcc-g77”包的形式提供。

不确定为什么pkg-config lapackpp --libs未列出-lgfortran

-I/usr/local/include/lapackpp指定与lapackpp相关的头文件。如果没有它,编译器在尝试包含它时会找不到lapackpp.h(#include <lapackpp.h>) - 请参阅问题中的编译器错误

答案 1 :(得分:0)

我终于解决了这个问题,但仍然想知道为什么必须如此。 可以将cpp文件链接到lapackpp库的唯一命令是:

g++ foo.cpp -o foo -lgfortran -llapackpp -I/usr/local/include/lapackpp

如果没有-lgfortran,或-I/usr/local/include/lapackpp替换为-L/usr/local/lib,则无效。

有没有人有答案?