我如何确定我正确安装了 LAPACK 和 Armadillo 库?
How I can be sure that I install LAPACK and Armadillo libraries correctly?
我是 C++ 的 LAPACK 库的新手。我研究大规模矩阵及其 QR 分解。我在 Codeblocks 中使用 Lapack 库时遇到问题。我 link 根据以下 link 编辑了这个库和代码块:
How do I link to a library with Code::Blocks?。我的 code::blocks 知道 Lapacks 中的所有 headers、命令和函数,但我无法 运行 dgeqrf
函数进行 QR 分解,并出现此错误:undefined reference to
dgeqrf `.
我也试过用
犰狳 图书馆。我能够 运行 它的简单命令,但是当我想 运行 qr(Q,R,X)
进行因式分解时,它给出了这个错误:undefined reference to _gfortran_compare_string'
。所以,我认为问题可能出在安装过程中(对于 lapack)。我已经下载了新版本的 LAPACK 并使用 CMakein C:\lapack 安装了它。我的操作系统是Windows7(64位)。
谁能告诉我哪里错了?在安装步骤还是linking步骤?如何找到这个问题的原因以及如何解决?
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
与您所写的相反,构建日志显示没有
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
,但是 linker 发现您没有为它提供目标文件
或定义该函数的库。
原因是 liblapack.a
是一个 Fortran 库 - 使用 GCC Fortran (gfortran
) 编译 -
这取决于 libgfortran
.
当您 link 您的程序所依赖的库时,您还必须 link 任何进一步的库
第一个库所依赖的。
您的印象似乎是您的 LAPACK 库是 C++ 库。它们是 Fortran 库:LAPACK 是用 Fortran 编写的。
如果您满足 linkage 要求,那么在 C++ 程序中 linking 它们没有障碍。
在这种情况下,这意味着您必须将 libgfortran
添加到您的 link 年龄。你必须把它添加到
link年龄序列在依赖它的任何目标文件或库之后。
你说你用CMake安装了LAPACK。如果是这样,那么您从源代码构建了 LAPACK 库,
使用 CMake 生成的 make
系统,并且 make
必须使用安装的 gfortran
编译器
在您的系统上执行此操作。
既然你有 gfortran
某处,你也有 libgfortran
。找到安装目录
gfortran
- 它将包含一个子目录 bin
,包含 gfortran.exe
- 并要求 Windows
在该安装目录下搜索静态库 libgfortran.a
或动态库(可能)
libgfortran-3.dll
。您似乎要使用静态库:在这种情况下,在 libgfortran.a
添加
你的 link 年龄结束了。
顺便说一句,您指定 linkage 库的方式有相当多的冗余。自从你
正在通过绝对路径名指定所有库 - 例如C:\lapack\lib\liblapack.a
-
指定任何 -L
选项是没有意义的,因为 -L
linker 选项仅用于告知
linker 搜索您以通常的缩写形式指定的库的目录,例如
... -LC:\lapack\lib ... -llapack ... -ltmglib ...
为不包含任何内容的目录提供 link 或 -L
选项毫无意义
您正在 linking 的库的数量,包括包含头文件的目录。在代码块中,
您可以从项目的构建选项中删除所有 Search directories -> Linker,
除非您选择在 Linker -> Other linker options.
中以短格式指定库
我是 C++ 的 LAPACK 库的新手。我研究大规模矩阵及其 QR 分解。我在 Codeblocks 中使用 Lapack 库时遇到问题。我 link 根据以下 link 编辑了这个库和代码块:
How do I link to a library with Code::Blocks?。我的 code::blocks 知道 Lapacks 中的所有 headers、命令和函数,但我无法 运行 dgeqrf
函数进行 QR 分解,并出现此错误:undefined reference to
dgeqrf `.
我也试过用
犰狳 图书馆。我能够 运行 它的简单命令,但是当我想 运行 qr(Q,R,X)
进行因式分解时,它给出了这个错误:undefined reference to _gfortran_compare_string'
。所以,我认为问题可能出在安装过程中(对于 lapack)。我已经下载了新版本的 LAPACK 并使用 CMakein C:\lapack 安装了它。我的操作系统是Windows7(64位)。
谁能告诉我哪里错了?在安装步骤还是linking步骤?如何找到这个问题的原因以及如何解决?
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
与您所写的相反,构建日志显示没有
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
,但是 linker 发现您没有为它提供目标文件
或定义该函数的库。
原因是 liblapack.a
是一个 Fortran 库 - 使用 GCC Fortran (gfortran
) 编译 -
这取决于 libgfortran
.
当您 link 您的程序所依赖的库时,您还必须 link 任何进一步的库 第一个库所依赖的。
您的印象似乎是您的 LAPACK 库是 C++ 库。它们是 Fortran 库:LAPACK 是用 Fortran 编写的。 如果您满足 linkage 要求,那么在 C++ 程序中 linking 它们没有障碍。
在这种情况下,这意味着您必须将 libgfortran
添加到您的 link 年龄。你必须把它添加到
link年龄序列在依赖它的任何目标文件或库之后。
你说你用CMake安装了LAPACK。如果是这样,那么您从源代码构建了 LAPACK 库,
使用 CMake 生成的 make
系统,并且 make
必须使用安装的 gfortran
编译器
在您的系统上执行此操作。
既然你有 gfortran
某处,你也有 libgfortran
。找到安装目录
gfortran
- 它将包含一个子目录 bin
,包含 gfortran.exe
- 并要求 Windows
在该安装目录下搜索静态库 libgfortran.a
或动态库(可能)
libgfortran-3.dll
。您似乎要使用静态库:在这种情况下,在 libgfortran.a
添加
你的 link 年龄结束了。
顺便说一句,您指定 linkage 库的方式有相当多的冗余。自从你
正在通过绝对路径名指定所有库 - 例如C:\lapack\lib\liblapack.a
-
指定任何 -L
选项是没有意义的,因为 -L
linker 选项仅用于告知
linker 搜索您以通常的缩写形式指定的库的目录,例如
... -LC:\lapack\lib ... -llapack ... -ltmglib ...
为不包含任何内容的目录提供 link 或 -L
选项毫无意义
您正在 linking 的库的数量,包括包含头文件的目录。在代码块中,
您可以从项目的构建选项中删除所有 Search directories -> Linker,
除非您选择在 Linker -> Other linker options.