Lapack链接错误,使用-fPIC重新编译

时间:2013-09-16 13:01:08

标签: c++ linker makefile cmake lapack

我有一个用Levenberg-Marquardt方法拟合非线性函数的复杂程序。

该程序使用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)

我做错了什么?请指教。

谢谢。

2 个答案:

答案 0 :(得分:8)

解决方案是使用-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位系统。你的选择!

干杯!

答案 1 :(得分:0)

如果使用了mkdir build; cd build; cmake ..; make路由,请使用cmake .. -DBUILD_SHARED_LIBS=ON

为什么会起作用? -fPIC选项使gcc使用相对地址[1]
评论已接受的答案: “更具体地说,共享库应该在进程之间共享,但是不一定总能在两个进程中的相同地址处加载该库。如果代码不是位置独立的,则每个进程都需要自己的程序复制”-西蒙·里希特
[1] GCC -fPIC option