我是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
你能帮我解决一下吗?提前谢谢!
答案 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
,则无效。
有没有人有答案?