如何正确配置pkgconf
并libffi
允许python3
构建过程在构建过程的每个步骤中正确使用我的libffi
版本,以便_ctypes
正确导入模块?我在这里缺少哪一块?
一些背景
我正在尝试从源代码构建 Python3 以使用 PyQt5 构建 GUI,要求之一是功能性 libffi-dev 库。我在这台 SLES11 计算机上没有 sudo 权限,也没有对典型库目录的写入权限,也不太可能被授予这些权限。我联系了管理机器的团队,但他们不愿意为我的项目更新整个系统库集。我必须从源代码构建约 30 个依赖项,我在这方面经验很少,但我熟悉配置-->制作-->安装过程。我陷入了该过程的最后一步(未能导入 _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
答案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
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
在所有情况下都是必要的。
答案2
您应该仅指定 的库包的名称pkgconf --validate
,而不是库文件的路径名.so
。换句话说,尝试:
pkgconf --validate libffi
答案3
我知道OP的问题已经解决,但我也遇到了同样的问题,OP的解决方案对我不起作用。我去下载了一个应用程序图像版本,对我有用。