opencv版本的查询
相关的一些开发依赖于opencv对应的版本。如果版本不匹配,可能就达不到要的目的。
·pkg-config opencv4 --modversion· 通过这个命令可以查询到当前环境中安装的opencv版本。
编译依赖opencv时如何写make file
当开发过程中使用第三方库时,我们在makefile中需要指定第三方库的头文件位置,对应的库位置等等。pkg-config可以快速的生成编译需要的头文件或者库文件位置指定。典型的用法如下
g++ test.c 'pkg-config opencv4 --cflags --libs'
'pkg-config opencv4 --cflags --libs'
在命令行下执行后的实际输出是 '-I /user/local/include/opencv4 -L/user/local/lib ....' 可以看到编译需要的一些路径自动生成了。
其中--cflags是获取编译包需要的预处理或者编译选项。 --libs是获取编译包所需要的链接选项。
编译时找不到对应的头文件
如果opencv正确安装,编译时使用pkg-config生成依赖路径,一般不会有问题。如果实在找不到,就要知道gcc寻找头文件的规则
- gcc编译文件查找头文件,首先是通过makefile中-I找到路径进行查找
- 查找gcc的环境变量C_INCLUDE_PATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH 所以你可以通过export这些环境变量,来帮助gcc找到头文件
- gcc最后会查找系统默认的指定目录。如:/usr/include /usr/local/include /usr/lib/gcc-lib/..../include等
编译时或者运行时程序提示找不到opencv的动态链接库
编译时
- 编译时gcc会优先查找-L指定的动态库路径
- 紧接着查找
LD_LIBRARY_PATH
指定的目录 - 最后查找系统默认的目录 /lib /usr/lib /usr/local/lib 等等
运行时
- 在编译的时候,可以指定运行程序运行时在指定的目录去找动态库
gcc -Wl,-rpath=./ -Wl,-rpath=./mylib/
表示编译好的程序在运行的时候优先在当前目录和mylib目录下找需要的动态库。 - 查找
LD_LIBRARY_PATH
指定的目录 - 通过系统环境ldconfig配置的路径
- 系统默认的库路径
用到opencv库的程序运行报错
undifined symbol _ZN2cv3dnn14dnn4_v202009083NetD1Ev
解决办法是,用二进制查看运行文件(bycompare)查找前半段符号_ZN2cv3dnn14dnn4找到后根据上下文知道这个符号属于opencv dnn库的。程序运行时找不到,说明运行时查找的opencv库和编译时的库版本不一致,可以根据后面的日期,找到对应的opencv版本,在运行环境上安装替换一下。从而解决问题
opencv的安装
一定要选对需要的版本,然后从官网下载
https://opencv.org/releases/
安装方法参考docs.opencv.org
里面查找installation
需要注意的是,如果想让pkg-config 生效,在编译opencv的时候要使用-DOPENCV_GENERATE_PKGCONFIG=ON选项,具体参考文档说明。
注意安装前提是cmake 和 g++ 已经安装成功,然后可以在官网上下载zip包源文件,然后根据说明进行build。
安装过程示例如下
unzip opencv-4.5.3.zip
mv opencv-4.5.3 opencv
mkdir build
cd build
cmake -DOPENCV_GENERATE_PKGCONFIG=ON ../opencv
make -j4
sudo make install
最后要运行ldconfig, 让系统更新新的动态链接库
sudo ldconfig