【问题标题】:How I can be sure that I install LAPACK and Armadillo libraries correctly?我如何确定我正确安装了 LAPACK 和 Armadillo 库?
【发布时间】:2016-12-04 03:36:36
【问题描述】:

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

我也试过用 犰狳图书馆。我可以运行它的简单命令,但是当我想运行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

【问题讨论】:

  • 显示你正在使用的链接命令
  • 没有看到失败的链接命令,没有人能说出链接失败的原因。请将失败构建的完整构建日志复制并粘贴到您的问题中。您将在失败的代码块构建的 构建日志 选项卡(而不是 构建消息 选项卡)中找到它。
  • @MikeKinghan 感谢您的评论,我将构建日志粘贴到我的问题中。
  • @talonmies,它是一个 c++ 代码,也在 Windows 中。我需要一个基于 Windows 的解决方案来查找链接问题。我看到了你对提到的问题的回答,但我不擅长 linux 来理解你在那里做什么。

标签: c++ codeblocks lapack


【解决方案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 库 - 使用 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 在 链接结束。

顺便说一句,您指定链接库的方式有相当多的冗余。自从你 通过绝对路径名指定所有库 - 例如C:\lapack\lib\liblapack.a - 指定任何 -L 选项是没有意义的,因为 -L 链接器选项的存在只是为了告诉 链接器在哪些目录中搜索您以通常的短格式指定的库,例如

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

为不包含任何目录的链接器提供-L 选项是没有意义的 您正在链接的库,包括包含头文件的目录。在代码块中, 您可以从项目的构建选项中删除所有 搜索目录 -> 链接器, 除非您选择在 Linker -> Other linker options 中以简写形式指定库。

【讨论】:

  • 感谢您的完整回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多