编译Boost::Python时出现问题

2024-06-17 15:43:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在python脚本上使用c++数值方法,但是在boostpython库中编译一些东西时遇到了一些问题。具体地说,我想向python公开amoba函数。我用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

有人能帮我解释一下这个错误的含义吗?也许能给我一些有用的提示来完成我的项目吗。值得注意的是,经典的boostpython示例编译得很好。 谢谢您!在

这是令人不快的文字:(第73-79行)

^{pr2}$

Tags: fromobjectincludeusrlocalargconverterpyobject
2条回答

你忘了参考接线员。因此,def得到的参数类型是double (*)(const NRVec<double>&),而不是它期望的const volatile T*。在

你的代码应该是这样的:

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

我怀疑你和那个问this question的人有类似的问题。在C++代码中传递函数指针作为参数吗?如果是这样的话,那么在Python中就不能这样做了。在

相关问题 更多 >