gpt4 book ai didi

c++ - 使用 Cython 和 distutilis 方法从 Python 调用 C++ 代码

转载 作者:太空狗 更新时间:2023-10-29 21:23:22 25 4
gpt4 key购买 nike

我正在尝试使用 cython 从 python 脚本调用 c++ 代码。我已经设法处理来自 here 的示例但问题是:我的 C++ 代码包含来自 opencv 的非标准库。我相信我没有正确链接它们,所以我需要有人看看我的 setup.py 和我的 cpp_rect.hcpp_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

The symbol not found (__ZN2cv3Mat10deallocateEv) 与 cv::Mat::deallocate() 函数有关,这表明我的导入工作不正常。

有什么想法吗?


我的其他类(class)如下:

这是我的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() 函数只是从 opencv(文件 cpp_rect.cpp)实例化一个 cv::Mat:

#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 脚本时,我得到了这个问题中首先描述的包含错误。

有什么想法吗?

最佳答案

已解决,感谢 Dietmar Kühl 的评论和 this video from 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:每个引用的库都应该在这里写它的容器文件夹;
  • libraries:必须将图书馆的名称放在这里

有关如何为 cython 配置库的更多问题可以通过观看 this video on how to use and configure a dynamic library (using Eclipse CDT) 来回答。 .

关于c++ - 使用 Cython 和 distutilis 方法从 Python 调用 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18423512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com