Ben*_*inB 23 c++ python boost boost-python python-3.x
boost.python如何处理Python 3?它只是Python 2吗?
hka*_*ser 16
较新版本的Boost应该可以与Python V3.x一起使用.很久以前就已经添加了这种支持,我相信在2009年成功推出Google Summer of Code项目之后.
将Python V3与Boost一起使用的方法是通过添加实例来正确配置构建系统:
using python : 3.1 : /your_python31_root ;
Run Code Online (Sandbox Code Playgroud)
到你的user-config.jam文件.
需要使用python3构建libboostpython才能执行此操作.这不适用于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
Run Code Online (Sandbox Code Playgroud)
然后编辑python行(最后一行),这样说:
using python : 3.5 : /usr/bin/python3 : /usr/include/python3.5m : /usr/lib ;
Run Code Online (Sandbox Code Playgroud)
这对于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
Run Code Online (Sandbox Code Playgroud)
而且你只需要第一个包含目录.
然后从头开始构建boost.(抱歉.)我将它安装到/ usr/local
cd /path/to/boost_1_64_0
./bootstrap.sh --prefix=/usr/local
./b2
sudo ./b2 install
Run Code Online (Sandbox Code Playgroud)
现在跳转到python示例目录,并构建教程
cd /path/to/boost_1_64_0/libs/python/example/tutorial
bjam
Run Code Online (Sandbox Code Playgroud)
如果你有一个系统安装boost,这将无法正确构建,因为在引擎盖下,bjam使用g ++参数"-lboost"链接到libboostpython.但是,在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
Run Code Online (Sandbox Code Playgroud)
如果要查看bjam正在使用的g ++命令,请执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
在这里我们看到问题,你需要在"-lboost_python"之前使用"-L/usr/includ/lib".因此,执行此操作以正确链接共享库:
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
Run Code Online (Sandbox Code Playgroud)
您可能需要重新运行ldconfig(或重新启动)
sudo ldconfig
Run Code Online (Sandbox Code Playgroud)
你终于准备好了:
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()
Run Code Online (Sandbox Code Playgroud)
是的,这个问题非常老了,但是我必须做一些这里的任何答案中都没有指定的事情(尽管它是根据一些建议构建的),所以我会快速记下我的整个过程:
tar --bzip2 -xf boost_1_68_0.tar.bz2
(您希望文件夹临时存放的位置)cd boost_1_68_0
./bootstrap.sh --with-python-version=3.6 --prefix=/usr/local
./b2
sudo ./bjam install
cp tools/build/example/user-config.jam $HOME
,然后修改该文件的内容using python : 3.6 : /usr/bin/python3 : /usr/include/python3.6m : /usr/lib ;
(或任何适合您环境的文件夹)给定这个 C++ 源文件BoostPythonHelloWorld.cpp
:
#include <boost/python.hpp>
char const* say_hi()
{
return "Hi!";
}
BOOST_PYTHON_MODULE(BoostPythonHelloWorld)
{
boost::python::def("say_hi", say_hi);
}
Run Code Online (Sandbox Code Playgroud)
这个 Python 脚本BoostPythonHelloWorld.py
:
import BoostPythonHelloWorld
print(BoostPythonHelloWorld.say_hi())
Run Code Online (Sandbox Code Playgroud)
它可以这样编译和运行:
gcc -c -fPIC -I/path/to/boost_1_68_0 -I/usr/include/python3.6 /other_path/to/BoostPythonHelloWorld.cpp
gcc -shared -Wall -Werror -Wl,--export-dynamic BoostPythonHelloWorld.o -L/path/to/boost_1_68_0/stage/lib -lboost_python36 -o BoostPythonHelloWorld.so
python3 BoostPythonHelloWorld.py
Run Code Online (Sandbox Code Playgroud)
对我来说不同的部分是-Wl,--export-dynamic BoostPythonHelloWorld.o
,我在其他地方没有看到过这一点,并且在添加该符号之前,我收到了有关未定义符号的 Python 错误。
希望这可以帮助某人!
归档时间: |
|
查看次数: |
27811 次 |
最近记录: |