2016-12-04 211 views
2

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

我也试过用 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

显示您正在使用的链接命令 – stark

+0

没有人能够看到为什么您的链接失败,而没有看到 失败的链接命令。请将复制失败的完整版本日志复制并粘贴到您的问题中。您可以在失败的代码块构建的** Build log **选项卡(而不是** Build messages **选项卡)中找到它。 –

+0

@MikeKinghan感谢您的评论,我在我的问题中粘贴了构建日志。 – Ham82

回答

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' 

此错误消息告诉您,在库liblapack.a对象文件ilaenv.f.obj使得以 功能_gfortran_compare_string一个电话,但链接发现,你已经没有对象,只要它文件 或定义该函数的库。

其原因是liblapack.a是一个Fortran库 - 是依赖于libgfortran - 与海湾合作委员会的Fortran(gfortran)编译。

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

您似乎觉得您的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,链接地址为 。

顺便说一句,你指定链接库的方式有相当多的冗余。由于您的 正在通过绝对路径指定所有库 - 例如C:\lapack\lib\liblapack.a - 指定任何-L选项是没有意义的,因为-L链接器选项仅用于告知 链接器要搜索以常用简写形式指定的库文件的目录,例如,

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

这是毫无意义的additionaly给链接-L选项不包含库的任何 您链接,包括包含头文件目录的目录。除非你选择specfy总之表单库中链接从项目的编译选项, >链接 - - >其他连接选项在代码块, 你可以删除所有搜索目录的。

+0

感谢您的完整答案。 – Ham82