2016-12-04 14 views
2

私はLAPACKライ​​ブラリでC++の新機能です。私は大規模な行列とそれらのQR分解に取り組んでいます。私はCodeblocksでLapackライブラリを使用することに問題があります。このライブラリとコードブロックは、次のリンクに基づいてリンクしました: How do I link to a library with Code::Blocks?私のコード::ブロックは、Lapacksのすべてのヘッダ、コマンド、関数を認識していますが、undefined reference to dgeqrf`というQRファクトで、dgeqrf関数を実行できませんでした。LAPACKとArmadilloライブラリを正しくインストールするにはどうすればいいですか?

また、私は アルマジロライブラリを使用しようとしました。私は単純なコマンドを実行することができますが、因数分解のためにqr(Q,R,X)を実行したかったときには、このエラーになります:undefined reference to _gfortran_compare_string'。だから、問題はインストール手順(ラップバック用)にあると思う。私は新しいバージョンの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

リンケージコマンドが失敗していないと、リンクが失敗している理由を知ることはできません。あなたの質問に失敗したビルドの完全なビルドログをコピー&ペーストしてください。これは、失敗したCodeblocksビルドの** Build log **タブ(** Build Message **タブではありません)にあります。 –

+0

@MikeKinghanご意見ありがとうございます、私は私の質問にビルドログを貼り付けました。 – Ham82

答えて

1

、ビルドのログには undefined reference to dgeqrfを示しません。このエラーメッセージは、ライブラリliblapack.aでオブジェクトファイルilaenv.f.objが 機能_gfortran_compare_stringを呼び出しますが、リンカは、あなたがいないオブジェクトでそれを提供していることを見つけたことを示しています

C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x376): undefined reference to `_gfortran_compare_string' 

:彼らは両方の _gfortran_compare_stringに未定義の参照を表示しますファイル またはその関数が定義されているライブラリ。 GCCのFortran(gfortran)を使用してコンパイル - - libgfortranに依存している

その理由は、liblapack.aは、Fortranライブラリであるということです。

あなたのプログラムが依存するライブラリをリンクするときは、最初のライブラリが依存する に、それ以上のライブラリをリンクする必要があります。

LAPACKライ​​ブラリがC++ライブラリであるという印象を受けているようです。彼らはFortranライブラリです:LAPACKはFortranで書かれています。 リンケージ要件を満たしていれば、C++プログラムでそれらをリンクするのに障害はありません。

この場合、リンケージにlibgfortranを追加する必要があります。そして、それに依存するオブジェクトファイルまたはライブラリの後に リンケージシーケンスに追加する必要があります。

あなたはCMakeでLAPACKをインストールしたと言います。もしそうなら、ソースからの のLAPACKライ​​ブラリを、CMakeによって生成されたmakeシステムで構築しました。そして、makeは、あなたのシステムに をインストールしたgfortranコンパイラを使用していたに違いありません。

gfortranがあるので、libgfortranもあります。インストールディレクトリgfortranの を見つける - それはgfortran.exeを含むサブディレクトリbinを、含まれています - と静的ライブラリlibgfortran.aまたは動的ライブラリ(おそらく) libgfortran-3.dllのためにそのインストールディレクトリの下に 検索するようにWindowsをお願いします。静的ライブラリを使用しているように見えます。その場合は、リンクの末尾に のlibgfortran.aを追加します。

ところで、リンケージライブラリを指定する方法にかなりの冗長性があります。 はすべてのライブラリを絶対パス名で指定しています。 C:\lapack\lib\liblapack.a - -Lオプションを指定するのは意味がありません。-Lリンカーオプションは、通常の短い形式で指定するライブラリを検索するためにリンカーにどのリンカーを指定するためだけに存在します。

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

それはあなたのヘッダファイルを含むディレクトリを含め、リンクされているライブラリのいずれかの を含まないディレクトリのためにリンカに-Lオプションを与えることadditionaly無意味です。 >その他のリンカオプション - あなたはリンカに短い形式でライブラリをspecfyすることを選択しない限り、プロジェクトのビルドオプション、 から>リンカ - コードブロックでは、 あなたは検索ディレクトリのすべてを削除することができます。

+0

あなたの完全な答えをありがとう。 – Ham82

関連する問題