Wywoływanie kodu C ++ z Pythona przy użyciu Cythona z podejściem distutilis
Usiłuję wywołać kod c ++ ze skryptu Pythona za pomocą cython. Udało mi się już pracować z przykłademtutaj ale rzecz w tym, że mój kod c ++ zawiera niestandardowe biblioteki z opencv. Wierzę, że nie łączę ich poprawnie, więc potrzebuję kogoś, kto zajrzy do mojegosetup.py i mójcpp_rect.h icpp_rect.cpp pliki.
Błąd, który otrzymuję, dotyczy pogrubionej linii w pliku * .cpp:cv :: Mat img1 (7,7, CV_32FC2, Scalar (1,3)); Kiedy próbuję przetestować bibliotekę, otrzymuję błąd dołączania podczas wykonywania$ python userect.py
:
Traceback (most recent call last):
File "userect.py", line 2, in <module>
from rectangle import Rectangle
ImportError: dlopen(/Users/marcelosalloum/Desktop/python_cpp_interface/rectangle.so, 2): Symbol not found: __ZN2cv3Mat10deallocateEv
Referenced from: /Users/marcelosalloum/Desktop/python_cpp_interface/rectangle.so
Expected in: flat namespace
in /Users/marcelosalloum/Desktop/python_cpp_interface/rectangle.so
Nieznaleziony symbol (__ZN2cv3Mat10deallocateEv) ma coś wspólnego zcv::Mat::deallocate()
funkcja, co wskazuje, że moje importowanie nie działa prawidłowo.
Jakieś pomysły?
Moje inne zajęcia są następujące:
To jest mójsetup.py plik. Uwaga, że już zawarłem 2 katalogi, chociaż nie jestem pewien, czy zrobiłem to poprawnie:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
name = 'Demos',
ext_modules=[
Extension("rectangle",
sources=["rectangle.pyx", "cpp_rect.cpp"], # Note, you can link against a c++ library instead of including the source
include_dirs=[".", "/usr/local/include/opencv/", "/usr/local/include/"],
language="c++"),
],
cmdclass = {'build_ext': build_ext},
)
Mójcpp_rect.h plik zawiera cv.h i przestrzeń nazw cv, jak pokazano poniżej:
#include "source/AntiShake.h"
#include <iostream>
#include "cv.h"
using namespace cv;
class Rectangle {
public:
int x0, y0, x1, y1;
Rectangle();
Rectangle(int x0, int y0, int x1, int y1);
~Rectangle();
int getLength();
int getHeight();
int getArea();
void move(int dx, int dy);
**void openCV();**
Rectangle operator+(const Rectangle& other);
};
a moja funkcja openCV () po prostu tworzy instancję cv :: Mat z opencv (plikcpp_rect.cpp):
#include "cpp_rect.h"
Rectangle::Rectangle() {
x0 = y0 = x1 = y1 = 0;
}
Rectangle::Rectangle(int a, int b, int c, int d) {
x0 = a;
y0 = b;
x1 = c;
y1 = d;
}
Rectangle::~Rectangle() {
}
void Rectangle::openCV(){
**cv::Mat img1(7,7,CV_32FC2,Scalar(1,3));**
}
...
Mogę skompilować plik za pomocą następującego polecenia:$ python setup.py build_ext --inplace
, który dostarcza mi plik * .so. Ale kiedy uruchamiam skrypt userect.py, otrzymuję informację o błędzie opisanym najpierw w tym pytaniu.
Jakieś pomysły?