同时使用 boost.python 和 boost.thread 时出现编译错误



我的目标是为我的python代码编写一个多线程C++DLL。python代码的功能是调用C++库使用PCL处理点云,而C++库将自动生成一个新线程来可视化点云。我的 boost.python 模块工作正常,直到我将 boost.thread 包含在我的C++库中。我得到的编译错误如下:

In file included from /usr/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:52:0,
                 from /usr/include/boost/python/object/value_holder.hpp:50,
                 from /usr/include/boost/python/object/class_metadata.hpp:11,
                 from /usr/include/boost/python/class.hpp:23,
                 from /usr/include/boost/python.hpp:18,
                 from /home/boooooosh/QuickAccess/Depowdering/blackbox/src/blackbox_skeleton/central_processor.cpp:8:
/usr/include/boost/python/object/value_holder.hpp: In instantiation of ‘boost::python::objects::value_holder<Value>::value_holder(PyObject*, A0) [with A0 = boost::reference_wrapper<const BlackboxProcessor>; Value = BlackboxProcessor; PyObject = _object]’:
/usr/include/boost/python/object/make_instance.hpp:71:48:   required from ‘static Holder* boost::python::objects::make_instance<T, Holder>::construct(void*, PyObject*, boost::reference_wrapper<const T>) [with T = BlackboxProcessor; Holder = boost::python::objects::value_holder<BlackboxProcessor>; PyObject = _object]’
/usr/include/boost/python/object/make_instance.hpp:45:74:   required from ‘static PyObject* boost::python::objects::make_instance_impl<T, Holder, Derived>::execute(Arg&) [with Arg = const boost::reference_wrapper<const BlackboxProcessor>; T = BlackboxProcessor; Holder = boost::python::objects::value_holder<BlackboxProcessor>; Derived = boost::python::objects::make_instance<BlackboxProcessor, boost::python::objects::value_holder<BlackboxProcessor> >; PyObject = _object]’
/usr/include/boost/python/object/class_wrapper.hpp:29:51:   required from ‘static PyObject* boost::python::objects::class_cref_wrapper<Src, MakeInstance>::convert(const Src&) [with Src = BlackboxProcessor; MakeInstance = boost::python::objects::make_instance<BlackboxProcessor, boost::python::objects::value_holder<BlackboxProcessor> >; PyObject = _object]’
/usr/include/boost/python/converter/as_to_python_function.hpp:27:61:   required from ‘static PyObject* boost::python::converter::as_to_python_function<T, ToPython>::convert(const void*) [with T = BlackboxProcessor; ToPython = boost::python::objects::class_cref_wrapper<BlackboxProcessor, boost::python::objects::make_instance<BlackboxProcessor, boost::python::objects::value_holder<BlackboxProcessor> > >; PyObject = _object]’
/usr/include/boost/python/to_python_converter.hpp:88:9:   [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/boost/python/object/class_metadata.hpp:229:80:   required from ‘static void boost::python::objects::class_metadata<T, X1, X2, X3>::register_aux2(T2*, Callback) [with T2 = BlackboxProcessor; Callback = boost::integral_constant<bool, false>; T = BlackboxProcessor; X1 = boost::python::detail::not_specified; X2 = boost::python::detail::not_specified; X3 = boost::python::detail::not_specified]’
/usr/include/boost/python/object/class_metadata.hpp:219:60:   required from ‘static void boost::python::objects::class_metadata<T, X1, X2, X3>::register_aux(void*) [with T = BlackboxProcessor; X1 = boost::python::detail::not_specified; X2 = boost::python::detail::not_specified; X3 = boost::python::detail::not_specified]’
/usr/include/boost/python/object/class_metadata.hpp:205:43:   required from ‘static void boost::python::objects::class_metadata<T, X1, X2, X3>::register_() [with T = BlackboxProcessor; X1 = boost::python::detail::not_specified; X2 = boost::python::detail::not_specified; X3 = boost::python::detail::not_specified]’
/usr/include/boost/python/class.hpp:497:29:   required from ‘void boost::python::class_<T, X1, X2, X3>::initialize(const DefVisitor&) [with DefVisitor = boost::python::init<>; W = BlackboxProcessor; X1 = boost::python::detail::not_specified; X2 = boost::python::detail::not_specified; X3 = boost::python::detail::not_specified]’
/usr/include/boost/python/class.hpp:630:5:   required from ‘boost::python::class_<T, X1, X2, X3>::class_(const char*, const char*) [with W = BlackboxProcessor; X1 = boost::python::detail::not_specified; X2 = boost::python::detail::not_specified; X3 = boost::python::detail::not_specified]’
/home/boooooosh/QuickAccess/Depowdering/blackbox/src/blackbox_skeleton/central_processor.cpp:154:48:   required from here
/usr/include/boost/python/object/value_holder.hpp:137:13: error: no matching function for call to ‘BlackboxProcessor::BlackboxProcessor(boost::reference_wrapper<const BlackboxProcessor>::type&)’
             BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_UNFORWARD_LOCAL, nil)
             ^
/usr/include/boost/python/object/value_holder.hpp:137:13: note: candidates are:
In file included from /home/boooooosh/QuickAccess/Depowdering/blackbox/src/blackbox_skeleton/central_processor.cpp:12:0:
/home/boooooosh/QuickAccess/Depowdering/blackbox/include/blackbox_skeleton/central_processor.h:72:3: note: BlackboxProcessor::BlackboxProcessor()
   BlackboxProcessor() {
   ^
/home/boooooosh/QuickAccess/Depowdering/blackbox/include/blackbox_skeleton/central_processor.h:72:3: note:   candidate expects 0 arguments, 1 provided
/home/boooooosh/QuickAccess/Depowdering/blackbox/include/blackbox_skeleton/central_processor.h:31:7: note: BlackboxProcessor::BlackboxProcessor(BlackboxProcessor&)
 class BlackboxProcessor {

每当我开始使用 boost::mutex 或 boost::thread,我都会收到此错误。我不太确定是什么导致了此错误。

非常感谢!

好吧,这可能不是一个解决方案,但我问了我的导师,他说如果你同时使用boost python及其线程功能,它就会出错。在我更改为 pthread lib 而不是 boost 后,一切正常。

但是,始终欢迎更优雅的解决方案!

最新更新