问题
使用 opencv-3.4.0 编写C++语言图像处理程序时,使用到了 caffe 模型,因此写出了下面这样的代码:
cv::dnn::Net net_ = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
...
然后编译之,发现居然报错了:
undefined reference to `cv::dnn::experimental_dnn_v3::Net::Net
看错误信息应该是提示找不到“Net”函数,opencv-3.4.0 是支持 Net 的,因此这是一个很奇怪的问题。
分析
仔细观察错误信息,发现提示的是cv::dnn::experimental_dnn_v3::Net::Net
,而我代码中写的是cv::dnn::Net
,这里有些差异。再查看我的编译命令:
$ g++ *.cpp -o test.out -L../opencv-3.4.0/lib`pkg-config --cflags --libs opencv`
可能是链接的库出错了,单独执行pkg-config
:
$ pkg-config --cflags --libs opencv
-I/usr/include/opencv ...
看到输出-I/usr/include/opencv
就明白了:虽然我显式的指定了 opencv-3.4.0 的路径,但是pkg-config
并不会从该路径查找相应的库,它仅从环境变量PKG_CONFIG_PATH
中查找,因为我没有指定该环境变量,所以它自然从系统库查找了。
解决
知道原因,解决问题就容易了,有两个方法:
- 不使用
pkg-config
命令,手动的一个个链接库-lopencv_video -lopencv_photo -lopencv_imgproc ...
- 指定环境变量
export PKG_CONFIG_PATH=<opencv-3.4.0绝对路径>/lib/pkgconfig
,然后再编译