在已经存在python安装环境的情况下,当安装第三方的包的时候出现报错提示
/usr/bin/ld: .../lib/libpython2.7.a(abstract.o): relocation R_X86_64_32 against 'a local symbol' can not be used when making a shared object; recompile with -fPIC .../lib/libpython2.7.a: could not read symbols: Bad value collect2: ld returned 1 exit status
乍一看,错误信息非常明白,就是无法生成动态库,需要使用 -fPIC
参数来重新编译 Python。其实,就是把 Python 编译成动态库。
有这么几种方法:
- 直接修改Makefile:使用原来的
./configure
参数生成 Makefile 后,打开并在 gcc 命令后面添加-fPIC
参数。 - 在
./configure
参数中设置 CFLAGS 变量:在原来的./configure
参数后面追加CFLAGS=-fPIC
。 - 在
./configure
参数中使用--enable-shared
:在原来的./configure
参数后面追加--enable-shared
。
其中,最后一种方法是最简单的,这种方式编译出来的py库是.so形式村的,必须将其路径添加到LD_LIBRARY_PATH里面。
在 make 的时候问题依在。我们明明看到每条 gcc 命令后面都跟了 -fPIC
参数,但是依然失败。继续在网络上搜索会找到如下几个原因:
- 系统不支持位置相关代码(position-dependent code)(参见)。
- 在64位系统上使用了32位的Python库。也就是你的Python被编译成了32位的。(参见)
- 你的Python库没有被放置到正确的位置,或者系统找不到你的Python库。(参见)
- 系统使用了错误的Python库。这就是多版本Python共存的典型问题。(参见)
通过编译的时候指定引用的目录去解决
./configure --prefix=/bla/bla LDFLAGS=-L/path/to/your/python/lib
如果还存在,可以通过设置 LDFLAGS 解决,如下:
./configure --prefix=/bla/bla LDFLAGS=-L.