我是C++的LAPACK库的新手。我研究大型矩阵及其QR因式分解。我在Codeblocks中使用Lapack库时遇到问题。我根据以下链接链接了此库和代码块:
How do I link to a library with Code::Blocks?。我的code::blocks知道Lapacks中的所有 header ,命令和函数,但是由于以下错误,我无法运行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
同样适用于 Armadillo 图书馆:
-------------- 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
最佳答案
与您所写的相反,构建日志显示为否undefined reference to dgeqrf
。它们都显示了 undefined reference _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
。查找安装目录of
gfortran
-将包含一个子目录bin
,其中包含gfortran.exe
-并要求Windows执行以下操作:在该安装目录下搜索静态库
libgfortran.a
或动态库(可能)libgfortran-3.dll
。您似乎要使用静态库:在这种情况下,请将libgfortran.a
添加到链接结束。
顺便说一句,在指定链接库的方式上有很多冗余。自从你
正在通过绝对路径名指定所有库-例如
C:\lapack\lib\liblapack.a
-指定
-L
选项是没有意义的,因为-L
链接器选项仅用于告诉链接器搜索要以通常的短格式指定的库的目录,例如
... -LC:\lapack\lib ... -llapack ... -ltmglib ...
为不包含任何目录的目录提供链接器
-L
选项是毫无意义的您要链接的库中,包括包含头文件的目录。在代码块中
您可以从项目的构建选项中删除所有搜索目录-> 链接程序,
除非您选择在链接器-> 其他链接器选项中指定短形式的库。
关于c++ - 如何确定正确安装LAPACK和Armadillo库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40955095/