在python中import cython编译的.so文件时报错
ImportError: ./salmetric.so: undefined symbol: _ZN2cv12_OutputArrayC1ERNS_3MatE
解决方法见4
1.ldd –r salmetric.So 列出所有的引用和符号
在一堆py开头的未定义的符号中有两个以ZN2cv开头的,是opencv的问题
2.c++filt _ZN2cv12_OutputArrayC1ERNS_3MatE 找出出错的函数
输出cv::_OutputArray::_OutputArray(cv::Mat&)
是opencv的问题,考虑版本不匹配问题
3.由于我不是root用户,在自己文件夹安装了opencv3.4.6,应该是版本混乱问题
但是一开始将怀疑对象放在python上了
怀疑是因为Cython用的opencv版本和python不一样
尝试
vim ~/.bashrc
export PYTHONPATH=$PYTHONPATH:~/program/opencv3/lib/python2.7/dist-packages
source ~/.bashrc
仍不可用,
ls usr/bin/python* 查看python版本
发现存在多个版本,设置版本:
vim ~/.bashrc
加入alias python='/usr/bin/python3.5'
source ~/.bashrc
再import salmetric.so
报错:Segmentation fault (core dumped)
cython重新编译salmetric
报错:没有模块cython
去掉加入的alias后仍报错,检查发现cython安装在2.7下
显式设置版本为2.7后,编译通过
vim ~/.bashrc
加入alias python='/usr/bin/python2.7
source ~/.bashrc
再次import ,仍报ImportError: ./salmetric.so: undefined symbol: _ZN2cv12_OutputArrayC1ERNS_3MatE,伤心
4.怀疑opencv版本问题
参考:https://stackoverflow.com/questions/31496020/importerror-on-cv2-so
第二条HuayiZeng的回答
vim ~/.bashrc
加入
export C_INCLUDE_PATH=$C_INCLUDE_PATH:~/program/opencv3/include/:~/program/opencv3/include/opencv2/
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:~/program/opencv3/include/:~/program/opencv3/include/opencv2/
export PATH=$PATH::~/program/opencv3/bin/
import 成功
over,撒花完结