Python 包装c++;类(使用opencv),给出;“未定义符号”;

Python 包装c++;类(使用opencv),给出;“未定义符号”;,python,c++,opencv,wrapper,Python,C++,Opencv,Wrapper,背景: 我正在尝试包装C++类,这样我就可以从Python中使用它。但只要我使用opencv中的任何内容(如:“cv::Mat frame;”,我就会得到一个“undefined symbol”错误。只要我删除“cv::VideoCapture wcam”行,所有内容都会按照它应该的方式编译和执行 我做错了什么 webcam.cpp: #include <iostream> #include <opencv2/highgui/highgui.hpp> #include &

背景: 我正在尝试包装C++类,这样我就可以从Python中使用它。但只要我使用opencv中的任何内容(如:“cv::Mat frame;”,我就会得到一个“undefined symbol”错误。只要我删除“cv::VideoCapture wcam”行,所有内容都会按照它应该的方式编译和执行

我做错了什么

webcam.cpp:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
using namespace std;


class webcam{
    private:
        cv::VideoCapture wcam;
    public:
        webcam();
        void nextFrame();
        //cv::Mat getNewFrame();
};


webcam::webcam(){}
void webcam::nextFrame(){
    std::cout << "TESTING TESTING";
}


extern "C" {
    webcam* webcam_new(){ return new webcam(); }
    void test(webcam* wc) {wc->nextFrame();}
    //void Foo_bar(Foo* camCon){ foo->bar(); }
}
cam.py:

import cv2
import numpy as np

from ctypes import cdll
lib = cdll.LoadLibrary('./webcam.so')

class camCon(object):
    def __init__(self):
        self.obj = lib.webcam_new()
     def test(self):
        lib.test(self.obj)

fooo = camCon()
fooo.test()
错误输出:

Traceback (most recent call last):
  File "wrapp.py", line 5, in <module>
    lib = cdll.LoadLibrary('./webcam.so')
  File "/usr/lib/python2.7/ctypes/__init__.py", line 443, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./webcam.so: undefined symbol: _ZN2cv12VideoCaptureC1Ev
回溯(最近一次呼叫最后一次):
文件“wrapp.py”,第5行,在
lib=cdll.LoadLibrary('./webcam.so')
LoadLibrary中的文件“/usr/lib/python2.7/ctypes/_init__uuu.py”,第443行
返回自我类型(名称)
文件“/usr/lib/python2.7/ctypes/_init__.py”,第365行,在_init中__
self.\u handle=\u dlopen(self.\u名称,模式)
OSError:./webcam.so:未定义的符号:_ZN2cv12VideoCaptureC1Ev
(我知道可以直接在python中使用openCV)

更新

我发现使用 “cv::垫框” 没关系,但是 “cv::视频捕获网络摄像头” 事实并非如此


谢谢!

我知道这很愚蠢,我想添加一条评论,但我的代表不好

无论如何,您是否尝试删除
cv::
部分,因为您已经在使用
usingnamespace-cv
指令


另外,我不确定
cv
cv2
彼此有何相似之处?我不太确定它们是同一件事。

解决:

在编译共享库时,我必须添加如下库:

g++ -shared -Wl,-soname,webcam.so -o webcam.so  webcam.o -lopencv_core -lopencv_highgui -lopencv_imgproc

尝试使用
网络摄像头将OpenCV dll(和lib?)文件复制到一个目录中。因此
库-对我来说,ot在加载您的lib时似乎找不到一些符号。尝试了一下,但没有成功。我从/usr/local/lib复制了所有libopencv.so文件,也从usr/local/include/OpenCV/usr/local/include/opencv2复制了所有.h/.hpp文件。
g++ -shared -Wl,-soname,webcam.so -o webcam.so  webcam.o -lopencv_core -lopencv_highgui -lopencv_imgproc