Python 出現需要使用fPIC重新編譯的問題


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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM