5

レーベンバーグ・マルカート法で非線形関数をフィッティングするための洗練されたプログラムがあります。

このプログラムは、私が使用した Lapack ライブラリの線形方程式系のソルバーを使用します。

extern "C" ...

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

問題:

今度は、実際の計算を開始するために、大容量の 64 コアのコンピューターに移動しました。このコンピューターには、Scientific 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)

私は何を間違えましたか?お知らせ下さい。

ありがとうございました。

4

2 に答える 2

0

mkdir build; cd build; cmake ..; makeルートを使用する場合は、 を使用しますcmake .. -DBUILD_SHARED_LIBS=ON

なぜこれがうまくいくのでしょうか?-fPIC オプションは、gcc が相対アドレスを使用するようにします [1]
受け入れられた回答に対するコメント: 「より具体的に言うと、共有ライブラリはプロセス間で共有されることになっていますが、ライブラリを常に同じアドレスにロードできるとは限りません。コードが位置に依存しない場合、各プロセスには独自のコピーが必要になります」 - Simon Richter
[1] GCC -fPIC オプション

于 2019-06-05T16:01:03.130 に答える