2016-12-04 180 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