2016-10-05 3 views
2

내 응용 프로그램에서는 boost_python과 python 3.5.2를 사용합니다. 나는 우분투에서 --with-shared 옵션을 사용하여 소스에서 파이썬 3.5.2을 구축 할 때 모든파이썬 3.5.2 소스에서 빌드 된 libpython3.5m.so와 비교되는 libpython3.so는 무엇입니까?

우분투 14에서 소스에서 내장, 나는 libpython3.so (7.6kB)와 libpython3.5m.so (12메가바이트)를 얻었다. 나는 큰 하나가 진짜라고 생각하고 작은 하나는 실제 인터페이스로 호출을 전달하는 것일 수 있습니다.

boost_python이 클라이언트가 파이썬 (https://svn.boost.org/trac/boost/ticket/2615)에 연결될 것으로 가정 할 수 있으므로 libpython3.so을 내 응용 프로그램과 연결했습니다. 하지만 실행하면 미해결 된 기호 오류가 발생합니다.

ldd -r myapp 또는 ldd -r libboost_python.so은 모두 nm -D libpython3.5m.so에서 찾을 수있는 해결되지 않은 모든 파이썬 기호를 나열했습니다.

# ldd -r lib/libboost_python3.so 
    linux-vdso.so.1 => (0x00007ffe767fb000) 
    libstdc+.so.6 => /usr/lib/x86_64-linux-gnu/libstdc+.so.6 (0x00007f130a7a3000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f130a58d000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f130a1c8000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1309ec2000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f130acf4000) 
undefined symbol: PyExc_ImportError (lib/libboost_python3.so) 
undefined symbol: PyProperty_Type (lib/libboost_python3.so) 
undefined symbol: PyExc_StopIteration (lib/libboost_python3.so) 
undefined symbol: PyBool_Type (lib/libboost_python3.so) 
undefined symbol: PyExc_ValueError (lib/libboost_python3.so) 
undefined symbol: PyList_Type (lib/libboost_python3.so) 
undefined symbol: _Py_NotImplementedStruct (lib/libboost_python3.so) 
undefined symbol: PyExc_TypeError (lib/libboost_python3.so) 
undefined symbol: PyDict_Type (lib/libboost_python3.so) 
... 

libpython3.so

libpython3.5m.so에 의존하지만, 그 자체가 더 그 상징이 없습니다.

나는 libpython3.so 대신 libpython3.5m.so으로 내 응용 프로그램을 연결해야한다고 생각합니다. 그러나 이상한 것은 내가 libpython3.so를로드 LD_PRELOAD를 사용하는 경우 libpython3.so을 갖는 방법을 사용하는 이유는, 그 기호는 ldd -r libboost_python3.so

# LD_LIBRARY_PATH=lib LD_PRELOAD=lib/libpython3.so ldd -r lib/libboost_python3.so 
    linux-vdso.so.1 => (0x00007ffcb51f0000) 
    lib/libpython3.so (0x00007f6f728e3000) 
    libstdc+.so.6 => /usr/lib/x86_64-linux-gnu/libstdc+.so.6  (0x00007f6f725df000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6f723c9000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6f72004000) 
    libpython3.5m.so.1.0 => lib/libpython3.5m.so.1.0 (0x00007f6f71ae1000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0  (0x00007f6f718c3000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6f715bd000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f6f72d32000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6f713b9000) 
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f6f711b6000) 

에서 발견되는 것입니다? 아니면 libpython3.5m.so 만 사용하면됩니까?

+0

'3.5m'이 다른 메모리 관리자와 함께 '3.5'라는 것을 알고 있기 때문에'python3.5m' 프로그램도 있어야합니다. 파이썬 문서에 몇 가지 정보가 있었지만 어디에서 기억이 나지 않습니다. – furas

+0

Ubuntu/Mint를위한 비공식 파이썬 repo -'Ubuntu 14.04'를위한'Python 3.5.2'를 얻을 수 있습니다 - https://launchpad.net/~fkrull/+archive/ubuntu/deadsnakes – furas

+0

Thanks @furas. https://docs.python.org/3/extending/embedding.html flasg : -lpython3.4m 링크의 예를 보여 드리겠습니다.'python3.so' 대신'python3.5m.so'를 사용해야한다고 생각합니다. 지금. –

답변

2

libpython3.so 라이브러리는 PEP 384 -- Defining a Stable ABI을 지원합니다.

역사적으로 파이썬은 부 버전 릴리스 (예 : 3.4에서 3.5 사이)에서 C 레벨에서 ABI 안정성을 보장하지 않습니다. 이들은 소스와 호환 될 수 있지만 특정 구조는 크기가 변하거나 구조 구성원이 유형이 변경 될 수 있습니다. 그러나 ABI의 일부분은 성숙되어 오랜 기간 동안 안정을 유지했습니다.

안정성있는 ABI PEP가 개발자가 하위 집합에 대한 이진 호환성을 유지하기 위해 노력하는 경우 향후 Python 개발에 부적절한 제한을 두지 않는 Python C API의 하위 집합을 식별했습니다. 프로그램이나 확장 프로그램이이 부분 집합만을 사용하도록 제한되면 이론적으로 재 컴파일없이 다른 Python 버전에서 사용될 수 있습니다.

안정적인 ABI를 사용하여 일부 코드를 컴파일했으면 런타임에 연결하는 방법에 대한 질문이 있습니다. Python 3.5.x의 경우 -lpython3.5m을 사용하여 링크해야합니다. Python 3.6.x의 경우 -lpython3.6m이 필요합니다. libpython3.so가 들어오는 곳이다

libpython3.so 라이브러리는 하나의 목적을했습니다.이 libpython3.5m.so로 연결하고 확장 링크가 -lpython3을 사용하는 경우 그래서 3.6에 등 libpython3.6m.so에 대한 링크 파이썬 3.5, 그것은에 액세스 할 수 있습니다 시스템에 설치된 Python 버전의 런타임.

이제 원래 문제로 돌아가십시오 : 안정적인 ABI에있는 기능 만 사용하고 있다는 확신이 들지 않으면 (어떤 경우에는 libboost_python이 안정적인 ABI 만 사용하는지 알아내는 것을 의미 함), 아마도 링크를 원할 것입니다 버전이 libpython3.5m.so입니다.

확실하지 않은 경우 버전이 지정된 라이브러리에 링크하는 것이 좋습니다. ABI 변경으로 인해 세그 폴트보다 동적 링크 오류를 디버그하는 것이 훨씬 쉽습니다. 최신 버전의 Python으로 업그레이드해야합니다.

+1

감사합니다 제임스. 필자의 경우,'boost_python'과 내 앱을 모두 구축하면서 안정된 ABI 부분에만 의존하게하려면'Py_LIMITED_API'를 정의해야합니다. 나는 시험해 볼게. –

+0

확실히 시도해 볼 가치가 있습니다. 그러나'boost_python'가 제한된 API 모드에서 컴파일되지 않으면, 아마도 그럴 가치가 없습니다. –

관련 문제