【问题标题】:Lapack linking error, recompile with -fPICLapack 链接错误,使用 -fPIC 重新编译
【发布时间】:2013-09-20 15:28:51
【问题描述】:

我有一个用 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)

我做错了什么?请指教。

谢谢。

【问题讨论】:

    标签: c++ linker makefile cmake lapack


    【解决方案1】:

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

    干杯!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 2013-08-25
        • 2016-04-25
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        相关资源
        最近更新 更多