Вызов кода C ++ из Python с использованием Cython с использованием подхода distutilis

Я пытаюсь вызвать код C ++ из сценария Python, используя Cython. Мне уже удалось поработать с примером из Вот но дело в том, что мой код на c ++ содержит нестандартные библиотеки из opencv. Я считаю, что я не связываю их правильно, поэтому мне нужен кто-то, чтобы посмотреть на мои setup.py и мой cpp_rect.h а также cpp_rect.cpp файлы.

Ошибка, которую я получаю, связана с жирной линией в файле * .cpp: cv :: Mat img1 (7,7, CV_32FC2, Scalar (1,3)); Когда я пытаюсь проверить библиотеку, я получаю ошибку включения при выполнении $ 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

Символ не найден (__ZN2cv3Mat10deallocateEv) как-то связан с cv::Mat::deallocate() функция, которая указывает, что мой импорт не работает должным образом.

Есть идеи?


Мои другие занятия следующие:

Это мое setup.py файл. Обратите внимание, что я уже включил 2 каталога, хотя не уверен, что сделал правильно:

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},

)

мой cpp_rect.h Файл включает в себя cv.h и пространство имен cv, как показано ниже:

#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);
};

и моя функция openCV () просто создает экземпляр cv :: Mat из opencv (файл cpp_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));**
}
...

Я могу скомпилировать файл с помощью следующей команды: $ python setup.py build_ext --inplace, который предоставляет мне файл * .so. Но когда я запускаю свой скрипт userect.py, я получаю ошибку включения, описанную вначале в этом вопросе.

Есть идеи?

3

Решение

Решено, благодаря комментариям Дитмара Кюля и это видео с YouTube!

Что случилось? Я обнаружил, что мой setup.py был неправильно настроен. Это должно быть как:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
name = 'DyCppInterface',
version = '1.0',
author = 'Marcelo Salloum dos Santos',
# The ext modules interface the cpp code with the python one:
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=[".","source" , "/opt/local/include/opencv", "/opt/local/include"],
language="c++",
library_dirs=['/opt/local/lib', 'source'],
libraries=['opencv_core', 'LibCppOpenCV'])
],
cmdclass = {'build_ext': build_ext},
)

Три вещи, на которые следует обратить внимание, чтобы правильно настроить это:

  • include_dirs: каждый указанный в файле setup.py или .h и .cpp файл должен иметь свою папку контейнера в include_dirs;
  • library_dirs: каждая библиотека, на которую ссылаются, должна иметь свою папку контейнера, написанную здесь;
  • библиотеки: здесь нужно указать название библиотеки

Дальнейшие вопросы о том, как настроить библиотеку для Cython можно найти, посмотрев это видео о том, как использовать и настраивать динамическую библиотеку (используя Eclipse CDT).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]