モジュールを正しくインポートできるように、ビルドプロセスのすべての段階でマイバージョンを正しく使用するようにビルドプロセスを正しく設定してpkgconf
許可libffi
するにはどうすればよいですか。ここで私が逃した部分は何ですか?python3
libffi
_ctypes
いくつかの背景
PyQt5でGUIを構築するためにソースからPython3を構築しようとしていますが、要件の1つは機能的なlibffi-devライブラリです。この SLES11 システムに対する sudo 権限もなく、汎用ライブラリ・ディレクトリへの書き込み権限もなく、そのような権限を付与される可能性もありません。マシンを管理するチームに連絡しましたが、彼らは私のプロジェクトの完全なシステムライブラリセットを更新するのを気にしませんでした。ソースから約30の依存関係を構築する必要があります。これについての経験はほとんどありませんが、設定-->make-->インストールプロセスに精通しています。 FFIライブラリから欠落しているシンボルを追跡するプロセスの最後のステップ(_ctypesモジュールのインポートに失敗しました)で停止しました。
*** 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
可能性が高くなります。しかし、私は実際に完全な初心者であり、ここでこの質問を入力しながら約1週間このビルド全体に参加したので、明らかに異なる考えを聞くことができます!
便利なデバッグ
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
My PKG_CONFIG
、、、PKG_CONFIG_PATH
およびlibffiファイルとpkgconfファイルの場所を反映するように更新されましたLD_LIBRARY_PATH
。LDFLAGS
PATH
pc
$ 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
ベストアンサー1
私も同じ問題があります。
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
ingはC_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