Прошу помощи в построении обертки для С++ кода и ее сборки с целью использования в Python3 скрипте.
Изложение моей попытки прилагается.
Имеется C++ класс Image:
$ cat image.h
#include <opencv2/opencv.hpp>
class Image {
public:
Image();
int getWidth(cv::Mat);
~Image();
};
$ cat image.cpp
#include "image.h"
Image::Image(){}
Image::~Image(){}
int Image::getWidth(cv::Mat img){return img.size().width;}
Для него создана Си обертка:
$ cat wrapper.cpp
#include <new>
#include "image.h"
extern "C" {
void * createImage(void) {
return new Image;
}
void deleteImage(void *ptr) {
delete ptr;
}
bool getWidth(void *ptr, cv::Mat img){
Image * ref = reinterpret_cast<Image*>(ptr);
return ref->getWidth(img);
}
}
Python3 скрипт имеет вид:
#!/usr/bin/python3
import cv2
from ctypes import cdll
cpplib = cdll.LoadLibrary('./wrapper.so')
filename="test.png"
img = cv2.imread(filename)
print(cpplib.getWidth(img))
Ну и наконец, правила сборки
wrapper.so: wrapper.o
gcc -shared -o $@ $<
wrapper.o: wrapper.cpp image.o
g++ -Wall -fPIC -O2 -c -o $@ $^ -lopencv_core
image.o: image.cpp
g++ -Wall -fPIC -O2 -o $@ -c $<
Попытка запуска питоноского скрипта
./test.py
Traceback (most recent call last):
File "./test.py", line 5, in <module>
cpplib = cdll.LoadLibrary('./wrapper.so')
File "/usr/lib/python3.6/ctypes/__init__.py", line 426, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python3.6/ctypes/__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ./wrapper.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE