Я пытаюсь создать ndarray в C ++, а затем вернуть его в программу Python.Я использую повышение для этой цели.Однако я столкнулся с проблемами при попытке импортировать файл .so в коде Python.Я попробовал на своем Mac, а также Ubuntu.Все они потерпели неудачу.Вот что я сделал:
Загрузите boost_1.68 с официального сайта (https://www.boost.org/users/download/), и следуйте инструкциям по установке, чтобы скомпилировать, но не устанавливать его.
Напишите игрушку C ++ lib, как показано ниже:
#include <boost/python.hpp>
#include <boost/python/numpy.hpp>
namespace bp = boost::python;
namespace bn = boost::python::numpy;
bn::ndarray bridge() {
Py_Initialize();
bn::initialize();
bp::tuple shape = bp::make_tuple(3, 3);
bn::dtype dtype = bn::dtype::get_builtin<float>();
bn::ndarray a = bn::zeros(shape, dtype);
return a;
}
BOOST_PYTHON_MODULE(example) {
bn::initialize();
bp::def("bridge", bridge);
}
Мой Makefile содержит следующие операторы:
PYTHON_INCLUDE_PATH = /Users/sam/anaconda2/include/python2.7
PYTHON_LIB_PATH = /Users/sam/anaconda2/lib/python2.7
BOOST_INCLUDE_PATH = /Users/sam/boost/boost_1_68_0/
BOOST_LIB_PATH = /Users/sam/boost/boost_1_68_0/stage/lib/
example.so: g++ cplusplus.cpp -std=c++11 -o example.so -I$(PYTHON_INCLUDE_PATH) -L$(PYTHON_LIB_PATH) -I$(BOOST_INCLUDE_PATH) -L$(BOOST_LIB_PATH) -lboost_python27
clean: rm -rf example.so
На моем Mac и Ubuntu появились разные проблемы:
- На Mac я использовал команду make для компиляции библиотеки C ++, после чего было сообщено об ошибкекак показано ниже.
Undefined symbols for architecture x86_64:
"_PyInt_FromLong", referenced from:
boost::python::converter::arg_to_python<int>::arg_to_python(int const&) in cplusplus-004248.o
"_PyTuple_New", referenced from:
boost::python::tuple boost::python::make_tuple<int, int>(int const&, int const&) in cplusplus-004248.o
"_Py_Initialize", referenced from:
bridge() in cplusplus-004248.o
"__Py_NoneStruct", referenced from:
boost::python::api::object::object() in cplusplus-004248.o
"boost::python::numpy::initialize(bool)", referenced from:
bridge() in cplusplus-004248.o
init_module_example() in cplusplus-004248.o
"boost::python::numpy::zeros(boost::python::tuple const&, boost::python::numpy::dtype const&)", referenced from:
bridge() in cplusplus-004248.o
"boost::python::numpy::dtype boost::python::numpy::detail::get_float_dtype<32>()", referenced from:
boost::python::numpy::detail::builtin_dtype<float, false>::get() in cplusplus-004248.o
"boost::python::converter::object_manager_traits<boost::python::numpy::ndarray>::get_pytype()", referenced from:
_typeobject const* boost::python::detail::object_manager_get_pytype<true>::get<boost::python::numpy::ndarray>(boost::python::numpy::ndarray const& (*)()) in cplusplus-004248.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [example.so] Error 1
- В Ubuntu я успешно скомпилировал библиотеку, но не смог импортировать сгенерированный файл example.so как модуль в консоли Python.Об ошибке ImportError:
ImportError: ./example.so: undefined symbol: ZN5boost6python5numpy10initializeEb
Я не знаю, где я допустил ошибки.Буду признателен за любые комментарии, которые помогут мне понять проблему.