«Ошибка сегментации (ядро сброшено)» Ошибка в Boost. Python Пример Hello_world - PullRequest
0 голосов
/ 25 апреля 2020

Для установки я следовал этой процедуре -> boost-py # Installation-for- linux -ubuntu

Файлы:

  • 'CMakeLists.txt'
cmake_minimum_required(VERSION 3.0)

find_package(Boost COMPONENTS python36 required)
find_package(PythonInterp 3)
find_package(PythonLibs 3)

PYTHON_ADD_MODULE(hello hello.cpp)

include_directories(/usr/include/python3.6m)

FILE(COPY hello.py DESTINATION .)

add_test(NAME 01-HelloWorld COMMAND ${PYTHON_EXECUTABLE} hello.py)
  • 'hello.py'
#!/usr/bin/env python

import hello
print (hello.greet())
  • 'привет. cpp'
char const* greet()
{
   return "hello, world";
}

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello)
{
    using namespace boost::python;
    def("greet", greet);
}

В основном я слежу за этим репо: TNG / boost- python -примеры

Сборка, Выполнение:

В процессе через терминал bash я получаю сообщение "Ошибка сегментации (ядро сброшено)" при работе $ ./hello.so или $ python hello.py

abhi3700@Abhijit:/mnt/f/Coding/github_repos/cpp-playground/gitcpplibs/boost-py-eg/01-HelloWorld$ cmake .
-- Boost  found.
-- Found Boost components:
   python36;required
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/f/Coding/github_repos/cpp-playground/gitcpplibs/boost-py-eg/01-HelloWorld
abhi3700@Abhijit:/mnt/f/Coding/github_repos/cpp-playground/gitcpplibs/boost-py-eg/01-HelloWorld$ make
[100%] Built target hello
abhi3700@Abhijit:/mnt/f/Coding/github_repos/cpp-playground/gitcpplibs/boost-py-eg/01-HelloWorld$ ./hello.so
Segmentation fault (core dumped)
abhi3700@Abhijit:/mnt/f/Coding/github_repos/cpp-playground/gitcpplibs/boost-py-eg/01-HelloWorld$ python3 hello.py
Segmentation fault (core dumped)
abhi3700@Abhijit:/mnt/f/Coding/github_repos/cpp-playground/gitcpplibs/boost-py-eg/01-HelloWorld$

Я пытаюсь устранить эту ошибку. Я сослался на множество решений, но не смог найти свое. Может кто-нибудь помочь, пожалуйста? Это действительно ВАЖНО !!! ...

СПАСИБО !!

1 Ответ

1 голос
/ 26 апреля 2020

Я нашел решение: новый "CMakeLists.txt" выглядит следующим образом:

cmake_minimum_required(VERSION 3.0)

project(greeter)

# Find necessary packages
find_package(PythonInterp 3)
find_package(PythonLibs 3 REQUIRED)
include_directories(${PYTHON_INCLUDE_DIR})

# find_package(Boost COMPONENTS python3 REQUIRED)
find_package(Boost COMPONENTS python${PYTHON_VERSION_MAJOR})

include_directories(${Boost_INCLUDE_DIR})

# Build & Link our library
add_library(hello MODULE hello.cpp)

# setting Boost_LIBRARIES & PYTHON_LIBRARIES
if(UNIX)
        set(Boost_LIBRARIES "/usr/lib/x86_64-linux-gnu/libboost_python3-py36.so.1.65.1")
        set(PYTHON_LIBRARIES "/usr/lib/x86_64-linux-gnu/libpython3.6m.so")
endif()

target_link_libraries(hello ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})

# don't prepend wrapper library name with lib
set_target_properties(hello PROPERTIES PREFIX "")

Это дает следующий вывод:

$ python3 hello.py
hello, world

На самом деле, я обнаружил проблему в hello.so (NEW) файл:

$ ldd hello.so
        linux-vdso.so.1 (0x00007fffda757000)
        libboost_python3-py36.so.1.65.1 => /usr/lib/x86_64-linux-gnu/libboost_python3-py36.so.1.65.1 (0x00007f2a52ec0000)
        libpython3.6m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0 (0x00007f2a52810000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2a52480000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2a52260000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2a51e60000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2a51c40000)
        libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f2a519f0000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2a517d0000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2a515c0000)
        libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f2a513b0000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2a51010000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2a53400000)

Итак, отсутствует libboost_python3-py36.so.1.65.1 т.е. boost_ python, который уже был установлен в моей системе через $ sudo apt-get install libboost-all-dev:

  • просто найдите это с помощью:
$ ls /usr/lib/x86_64-linux-gnu | grep libboost_python3 | grep 1.65.1
libboost_python3-py36.so.1.65.1

ПРИМЕЧАНИЕ: для 64-битной машины он сохраняется в /usr/lib/x86_64-linux-gnu, в противном случае в папке /usr/lib.

Спасибо @thatrobotguy & @squareskittles за внимание к моей проблеме. СПАСИБО! еще раз ..

...