编译Boost :: Python的问题

时间:2013-10-24 22:40:13

标签: c++ python boost compiler-errors boost-python

我想在我的python脚本上使用c ++数字配方,但是我在Boost Python库中编写了一些问题。具体来说我想将变形虫函数暴露给python。我使用Make而不是BJam。这是我尝试编译时得到的结果:

costantinoagnesi@costantino-HP-Pavilion-dv5-Notebook-PC:~/Desktop/Boost Python Test$  make
g++ -I/usr/include/python2.7 -I/usr/include -fPIC -c amoeba_py.C
In file included from /usr/local/include/boost/python/object/make_instance.hpp:10:0,
               from /usr/local/include/boost/python/object/make_ptr_instance.hpp:8,
               from /usr/local/include/boost/python/to_python_indirect.hpp:11,
               from /usr/local/include/boost/python/converter/arg_to_python.hpp:10,
               from /usr/local/include/boost/python/call.hpp:15,
               from /usr/local/include/boost/python/object_core.hpp:14,
               from /usr/local/include/boost/python/args.hpp:25,
               from /usr/local/include/boost/python.hpp:11,
               from amoeba_py.C:73:
/usr/local/include/boost/python/converter/registered.hpp: In function ‘const boost::python::converter::registration&
boost::python::converter::detail::registry_lookup2(T& (*)()) [with T = double(const NRVec<double>&)]’:
/usr/local/include/boost/python/converter/registered.hpp:94:40:   instantiated from ‘const >boost::python::converter::registration& boost::python::converter::detail::registry_lookup1(boost::type<T>) [with T = double (&)(const NRVec<double>&)]’
/usr/local/include/boost/python/converter/registered.hpp:105:23:   instantiated from const boost::python::converter::registration& boost::python::converter::detail::registered_base<double (&)(const NRVec<double>&)>::converters’
/usr/local/include/boost/python/converter/arg_from_python.hpp:269:99:   instantiated from  ‘boost::python::converter::pointer_arg_from_python<T>::pointer_arg_from_python(PyObject*) [with T = double (*)(const NRVec<double>&), PyObject = _object]’
/usr/local/include/boost/python/arg_from_python.hpp:70:18:   instantiated from ‘boost::python::arg_from_python<T>::arg_from_python(PyObject*) [with T = double (*)(const NRVec<double>&), PyObject = _object]’
/usr/local/include/boost/preprocessor/iteration/detail/local.hpp:43:1:   instantiated from >‘PyObject* boost::python::detail::caller_arity<5u>::impl<F, Policies, Sig>::operator( (PyObject*, PyObject*) [with F = void (*)(NRMat<double>&, NRVec<double>&, double, double (*)(const NRVec<double>&), int&), Policies = boost::python::default_call_policies, Sig = boost::mpl::vector6<void, NRMat<double>&, NRVec<double>&, double, double (*)(const NRVec<double>&), int&>, PyObject = _object]’
/usr/local/include/boost/python/object/py_function.hpp:38:33:   instantiated from ‘PyObject* boost::python::objects::caller_py_function_impl<Caller>::operator()(PyObject*, PyObject*) [with Caller = boost::python::detail::caller<void (*)(NRMat<double>&, NRVec<double>&, double, double (*)(const NRVec<double>&), int&), boost::python::default_call_policies, boost::mpl::vector6<void, NRMat<double>&, NRVec<double>&, double, double (*)(const NRVec<double>&), int&> >, PyObject = _object]’ amoeba_py.C:79:1:   instantiated from here
/usr/local/include/boost/python/converter/registered.hpp:86:7: error: no matching function >for call to ‘register_shared_ptr1(double (*)(const NRVec<double>&))’
/usr/local/include/boost/python/converter/registered.hpp:86:7: note: candidate is:
/usr/local/include/boost/python/converter/registered.hpp:77:3: note: template<class T> void boost::python::converter::detail::register_shared_ptr1(const volatile T*)
make: *** [amoeba_py.o] Error 1

有人可以帮我解读这个错误意味着什么,也许可以给我一些有用的提示来完成我的项目。值得注意的是,经典的Boost Python示例编译得很好。 谢谢!

这是令人讨厌的文字:(第73-79行)

#include <boost/python.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(amoeba)
{
     def("amoeba", NR::amoeba);
}

2 个答案:

答案 0 :(得分:0)

我怀疑你和问this question的人有类似的问题。您是否将函数指针作为参数传递给C ++代码?如果是这样,你不能用Python做到这一点 - 看看答案为什么。

答案 1 :(得分:0)

你忘记了参考操作员。因此def获取参数类型double (*)(const NRVec<double>&)而不是预期的const volatile T*

你的代码应该是这样的:

BOOST_PYTHON_MODULE(amoeba)
{
     def("amoeba", &NR::amoeba);
}