如何在不使用 sudo 的情况下构建 PKGCONF 和 LIBFFI 以及随后具有 ctypes 支持的 Python3.9 并对 /usr/local 进行写访问?

如何在不使用 sudo 的情况下构建 PKGCONF 和 LIBFFI 以及随后具有 ctypes 支持的 Python3.9 并对 /usr/local 进行写访问?

如何正确配置pkgconflibffi允许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_CONFIGPKG_CONFIG_PATHLD_LIBRARY_PATHLDFLAGSPATH已更新以反映 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

但就我而言,exportingC_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的解决方案对我不起作用。我去下载了一个应用程序图像版本,对我有用。

相关内容