Makefile 用-fPIC重新编译
我已经在我的机器上安装了(Ubuntu 12.04)。我正在尝试安装一个名为的库,我以前使用过并成功安装过该库(安装了MPICH2包的情况除外)。配置工作正常: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
/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期间尝试该选项可以做些什么