Python多版本共存导致动态库混乱的问题
来源:互联网 发布:液体浓度的算法 编辑:程序博客网 时间:2024/05/28 11:50
转载自:寂寞是国,我是王。 作者:Soli 原文地址:Python多版本共存导致动态库混乱的问题
在已经存在Python的环境中再源码安装其他版本的Python时,或源码安装mod_python或mod_wsgi等模块时,经常会出现动态库混乱的问题。常见的错误信息如下:
/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 valuecollect2: ld returned 1 exit status
乍一看,错误信息非常明白,就是无法生成动态库,需要使用-fPIC参数来重新编译Python。其实,就是把Python编译成动态库。有这么几种方法:
- 直接修改Makefile:使用原来的./configure参数生成Makefile后,打开并在gcc命令后面添加”-fPIC”参数。
- 在./configure参数中设置CFLAGS变量:在原来的./configure参数后面追加”CFLAGS=-fPIC”。
- 在./configure参数中使用–enable-shared:在原来的./configure参数后面追加”–enable-shared”。
其中,最后一种方法是网上最推荐的。
但令人沮丧的是,在make的时候问题依在。我们明明看到每条gcc命令后面都跟了”-fPIC”参数。继续在网络上搜索会找到如下几个原因:
- 系统不支持位置相关代码(position-dependent code)。(参见)
- 在64位系统上使用了32位的Python库。也就是你的Python被编译成了32位的。(参见)
- 你的Python库没有被放置到正确的位置,或者系统找不到你的Python库。(参见)
- 系统使用了错误的Python库。这就是多版本Python共存的典型问题。(参见)
对上面的第一种情况我们不做讨论。
对第二种情况,你可以使用file命令查看一下你的Python到底被编译成了64位还是32位,如下:
$ file pythonpython: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.8, dynamically linked (uses shared libs), not stripped
对于第三种情况,你可以通过在./configure参数中设置LDFLAGS变量,或在make前设置LD_LIBRARY_PATH环境变量来指明你要使用的Python库的路径。如下:
$ ./configure --prefix=/bla/bla LDFLAGS=-L/path/to/your/python/lib
或在Bourne shell (/bin/sh or /bin/bash)中:
$ LD_LIBRARY_PATH=/usr/local/lib$ export LD_LIBRARY_PATH$ make
或在C-shell (/bin/csh or /bin/tcsh)中:
% setenv LD_LIBRARY_PATH /usr/local/lib% make
下面是我遇到的第四种情况。上面给出的参见链接中,有人通过对比是否使用–enable-shared参数,以及是否使用–prefix参数,./configure的输出和make的输出,对该问题进行了仔细的研究。他发现,在使用–prefix参数后,编译命令中依然添加了系统中已经存在的python的include和lib路径。从而导致编译Python的附带模块时,链接的不是新生成的Python库,而是原来的系统中已经存在的Python库,而它恰巧并没有使用–enable-shared或-fPIC进行编译。
解决的办法就是,把系统原有的Python库的路径从编译参数中除去,或者把新的Python库所在的路径放到前面,让链接器先搜索该路径。对于Python自带的那些模块,这个路径应该就是当前路径”.”。可以通过设置LDFLAGS解决,如下:
$ ./configure --prefix=/bla/bla LDFLAGS=-L.
对于mod_python或mod_wsgi等模块可以使用–with-python解决,如下:
$ ./configure --prefix=/bla/bla --with-python=/path/to/your/python
- Python多版本共存导致动态库混乱的问题
- python多个版本的共存问题
- Mac python版本混乱的问题
- 多版本python共存的解决方案
- pyenv python多版本共存
- 解决多个版本的python共存时的问题 => 持续更新
- windows下的python多版本共存遇到的一些问题
- 因部署版本不一致导致的WEB和手机端APP数据冲突混乱问题
- jquery的版本共存问题
- 简单详细解决python版本共存问题
- windows下python多版本共存的解决记录
- python多版本的pip共存问题解决办法
- python多版本的pip共存问题解决办法
- pycharm下的多个python版本共存(一)
- pycharm下的多个python版本共存(二)
- VisualStudio2015配置共存的多个版本Python环境
- pycharm下的多个python版本共存
- window下多版本Python共存的配置和使用
- Cassandra失效检测原理
- 重构学习总结
- VC++ MFC Tutorial: Create MFC Extension Dll, Export MFC Classes
- C++对象的内存分布和虚函数表
- 如何在excel数据透视表的顶部显示列总计
- Python多版本共存导致动态库混乱的问题
- 获利能力分析实际数据收集流程
- 使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用
- JAVA中extends 与implements区别
- 使用github管理代码
- explicit构造函数
- Windows驱动开发小结
- Ouya获独家后僵尸末世游戏Human Element支持
- 计算机视觉、人工智能、数据挖掘顶级会议(Computer Version & AI & Data Mining Top Conference)