Я хочу написать функцию c ++, возвращающую std :: vector. Эта функция c ++ должна вызываться из файла python с оболочкой, так что std :: vector будет возвращен numpy ndarray в сценарии python. Поэтому я подготовил следующий пример кода
Файл теста. cpp:
#include <boost/python.hpp>
#include <boost/numpy.hpp>
#include <vector>
#include <iostream>
std::vector<float> ReturnArray( unsigned int N ){
std::vector<float> result;
for ( int i = 0 ; i < N ; i++ ){
result.push_back( float( i ) );
}
return result;
}
namespace bn = boost::numpy;
bn::ndarray mywrapper( unsigned int N ){
std::vector<float> v = ReturnArray( N );
Py_intptr_t shape[1] = { v.size() };
bn::ndarray result = bn::zeros( 1 , shape , bn::dtype::get_builtin<float>() );
std::copy( v.begin(), v.end(), reinterpret_cast<float*>( result.get_data() ) );
return result;
}
void Print( char const * test ){
std::cout << test << std::endl;
}
void Hello( void ){
std::cout << "Hello this is working" << std::endl;
}
using namespace boost::python;
BOOST_PYTHON_MODULE( test )
{
Py_Initialize();
bn::initialize();
def( "print" , Print );
def( "ReturnArray" , mywrapper );
def( "Hello" , Hello );
}
, а файл python test.py:
#!/usr/bin/env python3
import test
import ctypes
import sys
print( sys.version_info )
print(sys.executable)
test.print( "Hello passing string" )
test.Hello()
x = hello.ReturnArray( 10 )
print( x )
Затем я скомпилирую файл теста. cpp с
g++-6 -o test.so -fPIC -shared test.cpp -std=c++11 -lboost_python -lboost_numpy -I$CONDA_PREFIX/include -I$CONDA_PREFIX/include/python3.6m -I$CONDA_PREFIX/lib/python3.6 -L$CONDA_PREFIX/lib -Wl,-rpath,$CONDA_PREFIX/lib
Я делаю все это в среде conda. Буст библиотека установлена. Собственный компилятор c ++ - 6 также установлен в среде conda. Если я не использую что-либо из пространства имен numpy, то bn :: работает нормально. Но когда я начинаю включать функции и типы из numpy, я получаю следующую ошибку при запуске test.py
ImportError: неопределенный символ: _ZN5boost6python9converter21object_manager_traitsINS_5numpy7ndarrayEE10get_
If I un все bn :: functions кроме bn :: initialize () я получаю следующую ошибку ImportError: test.so: неопределенный символ: _ZN5boost5numpy10initializeEb
Я также пробовал этот пример без использования Конда вообще. Тогда этот пример работает просто отлично. У меня нет клея, что здесь происходит. Любая помощь очень ценится