我怎么能确定我正确安装LAPACK和Armadillo库?

时间:2016-12-04 03:36:37

标签: c++ codeblocks lapack

我是用于c ++的LAPACK库的新手。我从事大规模矩阵及其QR分解。我在Codeblocks中使用Lapack库时遇到问题。我根据以下链接链接了这个库和代码块: How do I link to a library with Code::Blocks?。我的代码:: blocks知道Lapacks中的所有头文件,命令和函数,但我无法运行dgeqrf函数进行QR事实化,并出现此错误:undefined reference to dgeqrf`。

我也尝试过使用 armadillo 库。我可以运行其简单的命令,但是当我想运行qr(Q,R,X)进行分解时,会出现此错误:undefined reference to _gfortran_compare_string'。所以,我认为问题可能出在安装过程中(对于lapack)。我已经下载了新版本的LAPACK并使用CMakein C:\ lapack 安装了它。我的操作系统是Windows 7(64位)。  谁能说出我的错误在哪里?在安装步骤或链接步骤中?如何找到此问题的原因以及如何解决? lapack库的构建日志消息:

 -------------- Build: Debug in lllll (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -LC:\lapack -LC:\arma -LC:\ttmath-0.9.3 -L"C:\Program Files\R\R-3.2.1\include" -LC:\lapack\lib -LC:\arma -o bin\Debug\lllll.exe obj\Debug\main.o   C:\lapack\lib\libblas.a C:\lapack\lib\liblapack.a C:\lapack\lib\liblapacke.a C:\lapack\lib\libtmglib.a C:\arma\examples\lib_win64\blas_win64_MT.lib C:\arma\examples\lib_win64\lapack_win64_MT.lib
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x376): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x3a1): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x3e6): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x40d): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x434): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x45b): more undefined references to `_gfortran_compare_string' follow
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: C:\lapack\lib\liblapack.a(ilaenv.f.obj): bad reloc address 0x60 in section `.rdata'
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

也适用于犰狳图书馆:

-------------- Build: Debug in ltest (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -Wall -fexceptions -g -IC:\ttmath-0.9.3 -I"C:\Program Files\R\R-3.2.1\include" -IC:\lapack\include -IC:\arma\include -c "D:\c++ code\ltest\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -LC:\ttmath-0.9.3 -L"C:\Program Files\R\R-3.2.1\include" -LC:\lapack\lib -LC:\arma -o bin\Debug\ltest.exe obj\Debug\main.o   C:\arma\examples\lib_win64\blas_win64_MT.lib C:\arma\examples\lib_win64\lapack_win64_MT.lib C:\lapack\lib\libblas.a C:\lapack\lib\liblapack.a C:\lapack\lib\liblapacke.a C:\lapack\lib\libtmglib.a
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x376): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x3a1): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x3e6): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x40d): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x434): undefined reference to `_gfortran_compare_string'
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x45b): more undefined references to `_gfortran_compare_string' follow
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: C:\lapack\lib\liblapack.a(ilaenv.f.obj): bad reloc address 0x60 in section `.rdata'
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分:1)

与您所写的内容相反,构建日志显示没有 undefined reference to dgeqrf。它们都显示未定义的引用 _gfortran_compare_string

C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x376): undefined reference to `_gfortran_compare_string'

此错误消息告诉您库ilaenv.f.obj中的目标文件liblapack.a进行调用 函数_gfortran_compare_string,但链接器发现您没有提供任何目标文件 或定义该功能的库。

原因是liblapack.a是一个Fortran库 - 使用GCC Fortran编译(gfortran) - 这取决于libgfortran

当您链接程序所依赖的库时,您还必须链接任何其他库 这是第一个图书馆所依赖的。

您似乎认为您的LAPACK库是C ++库。它们是Fortran库:LAPACK是用Fortran编写的。 如果您满足链接要求,那么在C ++程序中将它们链接起来就没有障碍。

在这种情况下,这意味着您必须将libgfortran添加到您的链接中。你必须把它添加到 依赖于它的任何目标文件或库之后的链接序列

你说你用CMake安装了LAPACK。如果是这样,那么你从源代码构建了LAPACK库, 使用CMake生成的make系统,make必须使用安装的gfortran编译器 在你的系统上做到这一点。

由于某处有gfortran,您还有libgfortran。找到安装目录 gfortran - 它将包含一个子目录bin,包含gfortran.exe - 并要求Windows 在该安装目录下搜索静态库libgfortran.a或动态库(可能) libgfortran-3.dll。您似乎使用静态库:在这种情况下,在{。}添加libgfortran.a 你的联系结束了。

BTW指定链接库的方式存在相当大的冗余。自从你 通过绝对路径名指定所有库 - 例如C:\lapack\lib\liblapack.a - 指定任何-L选项是没有意义的,因为-L链接器选项仅用于说明 链接器用什么目录来搜索你用通常的简短形式指定的库,例如

... -LC:\lapack\lib  ... -llapack ... -ltmglib ...

为不包含任何目录的目录提供链接器-L选项是无意义的 您要链接的库,包括包含头文件的目录。在Codeblocks中, 您可以删除所有搜索目录 - >来自项目构建选项的链接器, 除非您选择在链接器 - >>中选择以简短形式指定库其他链接器选项