libboostpython должен быть собран с python3, чтобы сделать это. Это не работает с boost 1.58 (который поставляется с Ubuntu 16.04), поэтому убедитесь, что вы скачали последнюю версию boost. Я только что сделал это с boost_1_64_0.
Как упомянуто выше, найдите файл «user-config.jam» в вашем дистрибутиве кода и скопируйте его в $ HOME.
cp /path/to/boost_1_64_0/tools/build/example/user-config.jam $HOME
Затем отредактируйте строку python (последнюю строку) так, чтобы она гласила:
using python : 3.5 : /usr/bin/python3 : /usr/include/python3.5m : /usr/lib ;
Это верно для Ubuntu 16.04. Вы можете использовать pkg-config, чтобы найти правильный каталог include.
user@computer > pkg-config --cflags python3
-I/usr/include/python3.5m -I/usr/include/x86_64-linux-gnu/python3.5m
И вам нужен только первый каталог include.
Тогда постройте буст с нуля. (Извините.) Я устанавливаю его в / usr / local
cd /path/to/boost_1_64_0
./bootstrap.sh --prefix=/usr/local
./b2
sudo ./b2 install
Теперь перейдите в каталог с примером Python и создайте учебник
cd /path/to/boost_1_64_0/libs/python/example/tutorial
bjam
Это не будет правильно работать, если у вас установлена система boost, потому что внутри bjam связывается с libboostpython с помощью параметра g ++ "-lboost". Но в Ubuntu 16.04 он просто найдет «/usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0», и тогда привязки python не будут загружены. На самом деле вы получите его ошибку:
ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0: undefined symbol: PyClass_Type
Если вы хотите увидеть команды g ++, которые использует bjam, сделайте следующее:
user@computer > bjam -d2 -a | grep g++
g++ -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC -I/usr/include/python3.5m -c -o "hello.o" "hello.cpp"
g++ -o hello_ext.so -Wl,-h -Wl,hello_ext.so -shared -Wl,--start-group hello.o -Wl,-Bstatic -Wl,-Bdynamic -lboost_python -ldl -lpthread -lutil -Wl,--end-group
Здесь мы видим проблему, вам нужно "-L / usr / included / lib" как раз перед "-lboost_python". Выполните это, чтобы правильно связать разделяемую библиотеку:
g++ -o hello_ext.so -Wl,-h -Wl,hello_ext.so -shared -Wl,--start-group hello.o -Wl,-Bstatic -Wl,-Bdynamic -L/usr/local/lib -lboost_python -ldl -lpthread -lutil -Wl,--end-group
Возможно, вам придется перезапустить ldconfig (или перезагрузить компьютер)
sudo ldconfig
И вы наконец готовы к работе:
user@computer > python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello_ext
>>> hello_ext.greet()
'hello, world'
>>> exit()