在已經存在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.