2013-09-16 61 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

解決方案是用-fPIC重新編譯lapack本身。因此,在您make.inc做以下修改:

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

而且你還可以使用-O3更好的優化,它工作正常!

選項-m64取決於您是否要使用64位系統。你的選擇!

乾杯!