Makefile 用-fPIC重新编译

Makefile 用-fPIC重新编译,makefile,mpi,configure,relocation,Makefile,Mpi,Configure,Relocation,我已经在我的机器上安装了(Ubuntu 12.04)。我正在尝试安装一个名为的库,我以前使用过并成功安装过该库(安装了MPICH2包的情况除外)。配置工作正常: /configure--prefix=/usr/local/qthreads--enable multi-node--with-multi-node runtime=mpi--with-portals4=/usr/local/portals4--with-hwloc=/usr/local/hwloc: ... ... ... Syste

我已经在我的机器上安装了(Ubuntu 12.04)。我正在尝试安装一个名为的库,我以前使用过并成功安装过该库(安装了MPICH2包的情况除外)。配置工作正常:

/configure--prefix=/usr/local/qthreads--enable multi-node--with-multi-node 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
我有,而且似乎显而易见的(也是唯一可能的)解决方案是按照编译器所说的去做:用
-fPIC
重新编译。然而,我不太愿意为Qthreads浏览和编辑任何makefile,因为它们既长又复杂。是否有一种简单的方法可以使用
-fPIC
重新编译


请告知。我非常感谢您的任何输入。

最终的答案将取决于所讨论的makefile,但是使用
makecflags=-fPIC
可能会像
MYCFLAGS
或许多其他此类变量一样工作。您必须查看Qthreads用于创建该归档的内容。

这也可能是一种症状,而不是问题所在。看看这个答案,看看它是否有用()。从MPICH 3.0.4开始,默认情况下是使用共享库而不是静态库进行构建,因此您可能需要确保它们是一致的。

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

感谢您的参考Wesley。我检查了解决方案,并尝试了一些不同的配置,但没有任何运气。我尝试使用
--启用共享
重新编译MPICH,但遇到了类似的错误(
针对.rodata重新定位R\u X86\u 64\u 32),在创建共享对象时无法使用;..
)。然后我尝试用
--启用共享
--禁用静态
重新编译Qthreads,但也没有成功(与OP中的错误相同)。对于如何重新编译MPICH或Qthreads,您有什么建议吗?您是否尝试过使用
--启用static
编译MPICH,因为这是非默认情况?这可能不会有什么不同,但这是您剩下的唯一组合?我能够使用
启用static
成功编译和构建MPICH。但是,即使尝试了
--启用共享
--启用静态
的每一种组合,我仍然无法生成Qthreads;无论我使用哪种方法,我都会继续收到相同的错误。啊,在这种情况下,我不太确定您的问题可能是什么。您是否尝试过另一个答案中的建议(
make CFLAGS=-fPIC
)?是的,我已将
-fPIC
选项添加到每个
*标志
变量中,但都没有结果。尽管如此,我似乎应该添加用于编译MPICH而不是Qthreads的选项,因为错误严格地考虑
libmpich.a
。我将看看在编译MPICH期间尝试该选项可以做些什么