如何建構 PKGCONF 和 LIBFFI 以及隨後的 Python3.9,支持 ctypes 而無需 sudo 和對 /usr/local 的寫入權限?
如何正確配置
pkgconf
並libffi
允許python3
建構過程在建構過程的每個步驟中正確使用我的libffi
版本,以便正確導入_ctypes
模組?我在這裡缺少哪一塊?一些背景
我正在嘗試從原始碼建構 Python3 以使用 PyQt5 建構 GUI,其中一個要求是功能性 libffi-dev 庫。我在這台 SLES11 機器上沒有 sudo 權限,也沒有對典型庫目錄的寫入權限,也沒有可能被授予這些權限。我聯繫了管理機器的團隊,但他們不願意為我的項目更新整個系統庫集。我不得不求助於從原始碼建構約 30 個依賴項,我在這方面幾乎沒有經驗,但我熟悉 configure–>make–>install 過程。我被困在流程的最後一部分(未能導入 _ctypes 模組),這可以追溯到 FFI 庫中缺少的符號。
*** WARNING: renaming "_ctypes" since importing it failed: build/lib.linux-x86_64-3.9/_ctypes.cpython-39-x86_64-linux-gnu.so: undefined symbol: ffi_prep_cif
libffi庫建構安裝沒有任何問題,並且可以在本地庫路徑中看到文件,所以得出的結論是libffi版本與另一個依賴項不匹配,或者pkgconf無法找到該庫. 根據我對 pkgconf 在隔離並指示驗證
libffi.so
文件時的行為的觀察,很可能是後者。但是,我實際上是一個完全的新手,我已經完成了整個建構大約一個星期,我在這裡輸入這個問題,所以我顯然願意聽取其他一些想法!一些有用的調試
pkgconf --version 1.7.3 https://distfiles.dereferenced.org/pkgconf/pkgconf-1.7.3.tar.gz libffi 3.3 ftp://sourceware.org/pub/libffi/libffi-3.3.tar.gz Python 3.9.1 https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz
我在製作 pkgconf 源時提供了指定本地庫目錄的選項
./configure --prefix=$HOME/LIBRARIES/--with-system-libdir=$HOME/LIBRARIES/lib:$HOME/LIBRARIES/lib64:/usr/lib:/lib --with-system-includedir=$HOME/LIBRARIES/include:/usr/include
我
PKG_CONFIG
的 ,PKG_CONFIG_PATH
,LD_LIBRARY_PATH
,LDFLAGS
和PATH
已更新以反映 libffipc
文件和 pkgconf 文件的位置$ echo $PKG_CONFIG $HOME/LIBRARIES/bin/pkgconf $ echo $PKG_CONFIG_PATH $HOME/LIBRARIES/lib/pkgconfig:$HOME/LIBRARIES/lib64/pkgconfig $ echo $LD_LIBRARY_PATH $HOME/LIBRARIES/lib:$HOME/LIBRARIES/lib64 $ echo $LDFLAGS -L$HOME/LIBRARIES/lib64/ -L$HOME/LIBRARIES/lib $ echo $PATH $HOME//LIBRARIES/bin:/usr/local/bin:/usr/bin $ ls $HOME/LIBRARIES/lib64/libff* libffi.a libffi.la libffi.so libffi.so.7 libffi.so.7.1.0
但是
pkgconf --validate
庫的驗證似乎失敗了,Python3 make 腳本記錄了未定義的符號。我更關心make腳本;我不確定 pkgconf 是否真的應該在這裡出錯。*在此處更新:*根據 pkgconf,該庫是有效的,因此排除了這種懷疑。謝謝你,電信
pkgconf --validate libffi $HOME/LIBRARIES/lib/pkgconfig/libffi.pc:9
為清楚起見添加 Python3 的配置命令
./configure --prefix=$HOME/LIBRARIES --enable-shared --with-system-ffi=$HOME/LIBRARIES/lib
我有完全相同的問題。
build/lib.linux-x86_64-3.9/_ctypes.cpython-39-x86_64-linux-gnu.so
將由 生成
make
,但未連結libffi
(正如我發現的那樣ldd
)。隨後,當make
執行setup.py
時,我會得到完全相同的錯誤:*** WARNING: renaming "_ctypes" since importing it failed: build/lib.linux-x86_64-3.9/_ctypes.cpython-39-x86_64-linux-gnu.so: undefined symbol: ffi_prep_cif Following modules built successfully but were removed because they could not be imported: _ctypes
但就我而言,
export
ingC_INCLUDE_PATH
不是問題。問題是_ctypes.cpython-39-x86_64-linux-gnu.so
編譯時沒有-lffi
. 我不得不setup.py
通過添加行來破解ext.libraries.append('ffi')
在函式定義的最後
def detect_ctypes(self):
為了記錄,我執行
configure
腳本CPPFLAGS="-I/my/path/include" LDFLAGS="-Wl,-rpath=/my/path/lib64 -Wl,-rpath=/my/path/lib" ./configure --prefix=/my/path --build=x86_64-redhat-linux --enable-shared --enable-optimizations
我不確定是否明確
CPPFLAGS
並且LDFLAGS
在所有情況下都是必要的。