https://blog.csdn.net/surgewong/article/details/39078251 【Ubuntu12安装OpenCV2】
https://www.cnblogs.com/woshijpf/p/3840530.html 【linux下编译OpenCV的方法】
https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc/409470#409470 【gcc/g++编译详解】
你的点赞和评论对我真的很重要!!
1.OpenCV安装包,https://opencv.org/releases/page/3/
在该页面找到2.4.13,下载并解压到目录
2.build-essential 软件包为编译程序提供必需软件包的列表信息,如头文件与库函数位置,并安装gcc/g++/gdb/make 等基本编程工具
sudo apt-get install build-essential
3.以下依赖用于支持读写图片以及视频
sudo apt-get install libgtk2.0-dev libavcodec-dev libavformat-dev libtiff4-dev libswscale-dev libjasper-dev
4.安装cmake
sudo apt-get install cmake
5.安装pkg-config,用于提供从源代码中编译软件时查询已安装的库时使用的统一接口
sudo apt-get install pkg-config
补充
你可能会遇到如下问题
unable to locate libjasper-dev
解决方案:更新仓库源
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
sudo apt update
sudo apt install libjasper1 libjasper-dev
error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope c->flags |= CODEC_FLAG_GLOBAL_HEADER;
……
解决方案:这是由于OpenCV的版本升级,预编译常量命名变化而导致的,因此需要你在OpenCV安装目录下找到cap_ffmpeg_impl.hpp,并在头部添加如下代码
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
据参考文章3可知,运行OpenCV主要有两种方法,CMake(一般用这个)和Command Line (可用于编译样例,检测OpenCV安装情况)。
(1)使用cmake来检测编译环境以及生成makefile以及其他project信息
cd opencv_dir
mkdir build //一般为命名为build或release
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
//CMAKE_BUILD_TYPE=RELEASE保证产生的makefile文件make生成的可执行文件带有调试信息,供gdb和gdbserver使用
//CMAKE_INSTALL_PREFIX设置编译路径
(2)make编译并安装
make -j$(nproc) //单纯make会很慢,$(nproc)指令表示能参与编译的最大内核线程数
//也可以自定义线程数如,make -j16
sudo make install
设置pkg-config的OpenCV库路径
export PKG_CONFIG_PATH=/..../OpenCV-dir/build/unix-install
//或者 export PKG_CONFIG_LIBDIR=/..../OpenCV-dir/build/unix-install
//LIBDIR环境变量优先级更高,一般用PATH设置即可
//该路径包含了opencv.pc文件,其中包含了头文件位置、库文件位置等信息
如果该目录下没有该文件则需要手动创建并配置,方法如下
cd /usr/local/lib
sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc
sudo vi opencv.pc //vi、vim、gedit都行,爱用哪个用哪个
添加如下信息
# Package Information for pkg-config
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.13.6
Libs: -L${exec_prefix}/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -lrt -lpthread -lm -ldl
Cflags: -I${includedir_old} -I${includedir_new}
保存并退出,导入环境变量
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
ps:导入环境变量的方法有很多,本文已经很长了,就不详细介绍了,简单提一下:
(1)直接导入库路径配置文件,在/etc/ld.so.conf.d下添加opencv.conf,并写入/usr/local/lib
(2)配置全局变量,在/etc/profile文件末尾追加
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后更新环境变量
source /etc/profile
(3)配置用户本地变量,在/etc/bash.bashrc文件末尾追加
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后更新环境变量
source /etc/profile
最后,更新系统库缓存
ldconfig
查看opencv是否配置成功
pkg-config --cflags opencv
pkg-config --libs opencv
切换到OpenCV-dir/samples/c/(或者cpp)
(1)简单方案,编译所有样例
cd /.../opencv_dir/samples/c/
cd ./build_all.sh //编译所有样例
cd ./find_obj
即可看到下图
(2)仅编译某个样例,使用如下的命令编译运行即可:
gcc -ggdb xxx.c -o xxx `pkg-config --cflags --libs opencv` //若文件为.c
g++ -ggdb xxx.cpp -o xxx `pkg-config --cflags --libs opencv` //若文件为.cpp
./xxx
-o 生成对象文件,其后紧跟要生成的对象文件名;
–cflags 引入各种头文件位置;
–libs 引入动态链接库;
另外,应当注意,gcc/g++采用比较严格的指令执行顺序(从左向右)。在最近的发行版本中,都默认使用了–as-needed参数,强制要求程序的对象文件必须出现在动态库之前并且它并不会因为参数顺序不对而报错,因此只有当-libs参数在xxx.cpp后时程序才能正常执行。
也就是说,以g++为例
g++ -ggdb `pkg-config --cflags --libs opencv` xxx.cpp -o xxx //错误
g++ -ggdb `pkg-config --cflags opencv` xxx.cpp -o xxx `pkg-config --libs opencv` //正确
g++ -ggdb xxx.cpp -o xxx `pkg-config --cflags --libs opencv` //正确