LINUX.ORG.RU

Сообщения doubletensor

 

Wrapper над С++ для Python3

Форум — Development

Прошу помощи в построении обертки для С++ кода и ее сборки с целью использования в 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

 , ,

doubletensor
()

RSS подписка на новые темы