我在Ubuntu 11.04中使用OpenCV 2.3至2.4.2开发了一个
Python模块. OpenCV是从源代码构建的.我没有使用Ubuntu存储库中的OpenCV版本.
我的Python模块编译没有问题,并正确加载在Python中.但是,当我在Ubuntu 11.10或12.04上编译此模块时,尝试在Python中加载它时,会收到一条包含“undefined symbol”消息的ImportError.
这是我如何编译模块:
g++ -fPIC -shared `pkg-config --cflags --libs python` `pkg-config --cflags --libs opencv` -I/usr/local/include/opencv2/legacy -o mymodule.so mymodule.cpp
这是“pkg-config –cflags –libs opencv”的输出
-I/usr/local/include/opencv -I/usr/local/include /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_ts.so /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so
我得到的错误是:
ImportError: /path/to/service/mymodule.so: undefined symbol: _ZN5CvSVMD1Ev
我的理解是,“未定义的符号”通常意味着给定的符号不能在任何链接的库中找到.但是我知道这个符号在libopencv_ml.so中,因为当我运行这个:
$nm -g /usr/local/lib/libopencv_ml.so | grep _ZN5CvSVMD1Ev
我得到:
000000000002fd40 T _ZN5CvSVMD1Ev
/usr/local / lib似乎在动态链接器缓存中.
$cat /etc/ld.so.conf.d/libc.conf
# libc default configuration
/usr/local/lib
而这样的文件也在缓存中.
$ldconfig -p | grep opencv | grep ml
libopencv_ml.so.2.4 (libc6,x86-64) => /usr/local/lib/libopencv_ml.so.2.4
libopencv_ml.so (libc6,x86-64) => /usr/local/lib/libopencv_ml.so
那么你可以给我任何线索我可能做错了什么? Ubuntu 11.04和11.10之间在运行Python时加载共享库的方式有什么变化?还是OpenCV的问题?