0

我想在我的 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);
}
4

2 回答 2

0

我怀疑你和问这个问题的人有类似的问题。您是否在 C++ 代码中将函数指针作为参数传递?如果是这样,你不能在 Python 中做到这一点——请参阅原因的答案。

于 2013-10-24T22:49:05.737 回答
0

您忘记了参考运算符。因此,def正在获取参数类型double (*)(const NRVec<double>&)而不是const volatile T*它所期望的。

您的代码应如下所示:

BOOST_PYTHON_MODULE(amoeba)
{
     def("amoeba", &NR::amoeba);
}
于 2013-10-24T23:50:04.333 回答