簡體   English   中英

我如何確定我正確安裝了 LAPACK 和 Armadillo 庫?

[英]How I can be sure that I install LAPACK and Armadillo libraries correctly?

我是 C++ 的 LAPACK 庫的新手。 我研究大規模矩陣及其 QR 分解。 我在 Codeblocks 中使用 Lapack 庫時遇到問題。 我根據以下鏈接鏈接了這個庫和代碼塊: How do I link to a library with Code::Blocks? . 我的 code::blocks 知道 Lapacks 中的所有標題、命令和函數,但我無法運行dgeqrf函數進行 QR 因子分解,並出現此錯誤: undefined reference to dgeqrf` 的undefined reference to

我也嘗試使用犰狳庫。 我能夠運行它的簡單命令,但是當我想運行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

與您所寫的相反,構建日志顯示沒有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。 如果是這樣,那么您使用 CMake 生成的make系統從源代碼構建了 LAPACK 庫,並且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選項是毫無意義的。 在 Codeblocks 中,您可以從項目的構建選項中刪除所有Search 目錄-> Linker ,除非您選擇在Linker -> Other linker options 中以簡短形式指定庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM