The*_*ist 5 c++ linker makefile cmake lapack
我有一个用Levenberg-Marquardt方法拟合非线性函数的复杂程序.
该程序使用来自Lapack库的线性方程组的求解器,我使用过:
extern "C" ...
Run Code Online (Sandbox Code Playgroud)
链接到外部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
Run Code Online (Sandbox Code Playgroud)
现在我收到错误:
/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
Run Code Online (Sandbox Code Playgroud)
只是为了记录,我的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)
Run Code Online (Sandbox Code Playgroud)
我做错了什么?请指教.
谢谢.
解决方案是使用-fPIC重新编译lapack本身.所以在你的make.inc中更改为以下内容:
FORTRAN = gfortran -m64 -fPIC
OPTS = -O2 -m64 -fPIC
DRVOPTS = $(OPTS)
NOOPT = -O0 -m64 -fPIC
LOADER = gfortran -m64 -fPIC
Run Code Online (Sandbox Code Playgroud)
你也可以使用-O3更好的优化,它工作正常!
该选项-m64取决于您是否要使用64位系统.你的选择!
干杯!
| 归档时间: |
|
| 查看次数: |
2721 次 |
| 最近记录: |