【发布时间】:2015-02-09 22:38:44
【问题描述】:
背景: 我正在尝试包装一个 c++ 类,以便可以从 python 中使用它。但是,一旦我使用 opencv 中的任何内容(例如:“cv::Mat frame;”,我就会收到“未定义符号”错误。一旦我删除“cv::VideoCapture wcam;”行,一切都会编译并执行应该。
我做错了什么?
网络摄像头.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(); }
}
编译:
g++ -c -fPIC webcam.cpp -o webcam.o -lopencv_core -lopencv_highgui
g++ -shared -Wl,-soname,webcam.so -o webcam.so webcam.o
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
(我知道可以直接在python中使用openCV)
更新
我发现使用 “cv::Mat 框架” 没关系。但 “cv::VideoCapture 网络摄像头” 不是。
谢谢!
【问题讨论】:
-
尝试将 OpenCV dll(和 lib?)文件复制到您的
webcam.so库的目录中 - 对我来说,看起来 Python 在加载您的 lib 时找不到某些符号。 -
试过了,但没用。我从 /usr/local/lib 复制了所有 libopencv.so 文件,还从 usr/local/include/opencv /usr/local/include/opencv2 复制了所有 .h/.hpp 文件。