PKGCONF 및 LIBFFI를 빌드하고 ctypes 지원을 통해 Python3.9를 빌드하고 sudo를 사용하지 않고/usr/local에 대한 쓰기 액세스를 어떻게 작성합니까?

PKGCONF 및 LIBFFI를 빌드하고 ctypes 지원을 통해 Python3.9를 빌드하고 sudo를 사용하지 않고/usr/local에 대한 쓰기 액세스를 어떻게 작성합니까?

모듈을 올바르게 가져올 수 있도록 빌드 프로세스의 모든 단계에서 내 버전을 올바르게 사용하도록 빌드 프로세스를 올바르게 구성 pkgconf하고 libffi허용하려면 어떻게 해야 합니까 ? 여기서 내가 놓친 부분은 무엇입니까?python3libffi_ctypes

일부 배경

PyQt5로 GUI를 빌드하기 위해 소스에서 Python3을 빌드하려고 하는데 요구 사항 중 하나가 기능적인 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후자일 가능성이 높습니다. 그러나 저는 실제로 완전한 초보자이고 여기에 이 ​​질문을 입력하는 동안 약 일주일 동안 이 전체 빌드에 참여했기 때문에 분명히 다른 생각을 들을 수 있습니다!

유용한 디버깅

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, LD_LIBRARY_PATHLDFLAGS가 libffi 파일 및 pkgconf 파일의 위치를 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

하지만 내가 생각하는 한, exporting는 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

답변2

pkgconf --validate라이브러리 파일의 경로 이름이 아닌 라이브러리 패키지의 이름만 지정해야 합니다 .so. 즉, 다음을 시도해 보세요.

pkgconf --validate libffi

답변3

OP의 문제가 해결되었다는 것을 알고 있지만 동일한 문제가 있으며 OP의 솔루션이 작동하지 않습니다. 하나 다운받으러 갔어애플리케이션 이미지버전이 나를 위해 일했습니다.

관련 정보