【问题标题】:Recompiling with -fPIC使用 -fPIC 重新编译
【发布时间】:2013-08-25 14:02:48
【问题描述】:

我的机器(Ubuntu 12.04)上安装了MPICH 3.0.4。我正在尝试安装一个名为Qthreads 的库,我之前使用过并成功安装过它(安装了 MPICH2 包除外)。配置工作正常:

./configure --prefix=/usr/local/qthreads --enable-multinode --with-multinode-runtime=mpi --with-portals4=/usr/local/portals4 --with-hwloc=/usr/local/hwloc:

...
...
...
System Characteristics:
       Target Style: unix
         Multi-node: yes, mpi
       Topology API: hwloc
        Qtimer type: clock_gettime
     Aligned_t size: 8 (aligned on 8 byte boundaries)
 Default Stack size: 4kB

Safety/Debugging:
   Sanity assert()s: no
    Check alignment: no
          Profiling: none
   Debugging Output: no
        Guard Pages: no

Speed:
          Scheduler: sherwood (multiworker shepherds)
         Sinc Style: donecount
      Barrier Style: feb
   Dictionary Style: simple
    Lazy Thread IDs: yes
       Pools/caches: memory, spawns
            RCRTool: no
Increments/CAS/FEBs: Compiler Builtin (both), lock-based hash

当我尝试运行 make 时,我收到以下错误:

  ...
  ...
  ...
  CCLD     libqthread.la
/usr/bin/ld: /usr/local/lib/libmpich.a(barrier.o): relocation R_X86_64_32 against `MPIR_ThreadInfo' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libmpich.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[2]: *** [libqthread.la] Error 1
make[2]: Leaving directory `/home/alex/Downloads/qthread-1.9/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/alex/Downloads/qthread-1.9/src'
make: *** [all-recursive] Error 1

我有looked around,似乎显而易见的(也是唯一可能的)解决方案是按照编译器所说的去做:使用-fPIC 重新编译。但是,我很犹豫是否要为 Qthreads 编辑任何 Makefile,因为它们又长又复杂。有没有用-fPIC 重新编译的简单方法?

请指教。我很感激任何意见。

【问题讨论】:

    标签: makefile mpi configure relocation


    【解决方案1】:

    最终的答案将取决于相关的 makefile,但使用 make CFLAGS=-fPIC 可能会像 MYCFLAGS 或任何其他此类变量一样工作。您必须查看并查看 Qthreads 使用什么来创建该存档。

    【讨论】:

      【解决方案2】:

      这也可能是一种症状,而不是问题。看看这个答案,看看它是否有帮助(how to recompile with -fPIC)。从 MPICH 3.0.4 开始,默认是使用共享库而不是静态构建,因此您可能需要确保它们是一致的。

      【讨论】:

      • 感谢韦斯利的参考。我检查了解决方案并尝试了一些不同的配置,但没有任何运气。我尝试使用--enable-shared 重新编译 MPICH,但遇到了类似的错误(relocation R_X86_64_32 against '.rodata' can not be used when making a shared object;...)。然后我尝试用--enable-shared--disable-static 重新编译Qthreads,也没有运气(与OP 中的错误相同)。你对我应该如何重新编译 MPICH 或 Qthreads 有什么建议吗?
      • 您是否尝试使用--enable-static 编译 MPICH,因为这是非默认情况?它可能不会有什么不同,但这是你剩下的唯一组合?
      • 我能够使用enable-static 成功编译和构建 MPICH。但是,即使尝试了--enable-shared--enable-static 的每种组合,我仍然无法制作Qthreads;无论我使用哪个,我都会继续收到相同的错误。
      • 啊,在这种情况下,我不太确定您的问题可能是什么。您是否尝试过其他答案 (make CFLAGS=-fPIC) 中的建议?
      • 是的,我已经为每个 *FLAGS 变量添加了 -fPIC 选项,但都没有结果。虽然,我似乎应该添加编译 MPICH 而不是 Qthreads 的选项,因为该错误严格涉及 libmpich.a。我会看看在编译 MPICH 期间尝试该选项可以做些什么
      【解决方案3】:

      经过所有讨论后,我全新安装了 MPICH 3.0.4,--enable-shared 是唯一给出的配置选项。由于某种原因,它成功编译和构建,尽管之前没有这样做。完成此操作后,无需任何额外选项即可成功配置和构建 Qthreads。

      【讨论】:

        猜你喜欢
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        相关资源
        最近更新 更多