2013-09-16 17 views
5

私は、Levenberg-Marquardtの方法で非線形関数をフィッティングするための洗練されたプログラムを持っています。Lapackリンクエラー、-fPICで再コンパイル

プログラムは、私が使用しているLAPACKライ​​ブラリーからの線形方程式のシステムのためのソルバーを使用しています。

extern "C" ... 

は、外部のFORTRANライブラリとリンクします。プログラムは私のラップトップで問題なく(Ubuntu 12.04を使用して)動いていました。私はしばらくテスト用に使っていました。

問題:

は今、私はいくつかの実際の計算をやって起動するために、大きな脂肪、64コアのコンピュータに移動し、コンピュータはそれに科学のLinux 6を有しています。それは大きなコンピュータがLAPACKがインストールされていないことが判明したので、私は、LAPACK 3.4.2だ、それをコンパイルし、それを構築するには、ここからの指示に従った:その後

http://matrixprogramming.com/2011/04/using-lapack-from-c/comment-page-1

、私は絶対に変更しました前に働いていた私のcmakeのファイルでは何もなく、ただのリンクオプションを追加しました:

-L/xdata/Compilers/Sources/lapack-3.4.2 

は今、私はエラーを取得する:

/usr/bin/ld: /xdata/Compilers/Sources/lapack-3.4.2/liblapack.a(dsytrf.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC 

そして、ちょうどレコードについて、私のcmakeのスクリプトはどこにでも-fPICと-fPIEを持っている...リンク私はそれを使用されています

target_link_libraries(LibsModule -lgsl) 
target_link_libraries(LibsModule -lgslcblas) 
target_link_libraries(LibsModule -lrt) 
target_link_libraries(LibsModule -lpthread) 
target_link_libraries(LibsModule -pie) 
target_link_libraries(LibsModule -fPIC) 
target_link_libraries(LibsModule -L/xdata/Compilers/Sources/lapack-3.4.2) 
target_link_libraries(LibsModule -lgfortran) 
target_link_libraries(LibsModule -llapack -fPIC) 
target_link_libraries(LibsModule -lblas -fPIC) 

は私が間違って何をしたのですか?お知らせ下さい。

ありがとうございます。

答えて

5

解決策は、lapack自体を-fPICで再コンパイルすることでした。だから、次のようにあなたのmake.incの変化:

FORTRAN = gfortran -m64 -fPIC 
OPTS  = -O2 -m64 -fPIC 
DRVOPTS = $(OPTS) 
NOOPT = -O0 -m64 -fPIC 
LOADER = gfortran -m64 -fPIC 

そして、あなたはまた、より良い最適化のため-O3を使用することができ、それが正常に動作します!

オプション-m64は、64ビットシステムを使用するかどうかによって異なります。あなたの選択!

乾杯!

関連する問題