说明:
.cache
文件夹里,可以按照其提示的下载地址,提前下载到对应位置。可以参考和这个教程。肯定是先把 gcc gcc-c++ kernel-devel gcc-gfortran git make 这些安装好,然后手动安装cmake,自动安装的cmake版本太低了,安装后也要升级的。
- yum install libgnomeui-devel gnome-devel gnome-devel-docs #(安装gtk 图形化界面库)安装必要文件包(第一个),后面是可选
- yum install gtk2 gtk2-devel gtk2-devel-docs # 为了支持GUI特征,没有这,编译可能会成功,但是使用时,imshow()这样的代码在编译或是使用时就会报错
- yum install gstreamer-plugins-base-devel gstreamer-devel.x86_64 gstreamer-ffmpeg.x86_64
- yum install boost boost-thread boost-devel
- yum install libdc1394-devel libv4l-devel # 为了支持摄像头
- yum install eigen3-devel
- yum install freeglut-devel libtiff-devel python-devel numpy
- yum install lapack-devel.x86_64 # 线性函数库
- yum install mesa-libGL mesa-libGL-devel # Mesa: 3D是一个在MIT许可证下开放源代码的三维计算机图形库,以开源形式实现了OpenGL的应用程序接口
- yum install nasm mercurial libtool zlib-devel
- yum install openexr-devel libwebp-devel libjpeg-turbo-devel libpng-devel jasper-devel # 图形文件解码库更新
- yum install tbb-devel # 线程构建模块 Intel’s Threading Building Blocks (TBB),是Intel公司开发的并行编程开发的工具。
- yum install openblas-devel.x86_64 # OpenBLAS是一个基于BSD许可(开源)发行的优化BLAS计算库
- yum install atlas-devel.x86_64 # BLAS线性算法库的优化版本。
ffmpeg组件安装(其实都是ffmpeg的安装),看这里;
这里有一个很对编译选项打开或是关闭的demo,就随便看看。
以opencv3为例,来手动编译,不添加环境变量,假设开始操作前的路径是/opt/
wget https://github.com/opencv/opencv/archive/3.4.13.zip
https://github.com/opencv/opencv/archive/4.8.0.zip # 其它版本换对应版本号unzip 3.4.13.zip
cd opencv-3.4.13
mkdir build install // 创建两个文件夹
cd build
cmake -DCMAKE_INSTALL_PREFIX=../install .. // 就把文件安装在刚刚创建的 install 目录里(一定要提前创建,不然就全部在build中,不方便查看)
cmake -D CMAKE_BUILD_TYPE=Debug \
-D CMAKE_INSTALL_PREFIX=../my_install/Debug -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.6.0/modules ..
# 这种就是把opencv_contrib也编译进来,方便后续使用dnn模块,参看上面的说明第3.点(看情况吧,或许就先按照前面的来,这个opencv_contrib看需吧,一般也用不到)
make -j4
make install
使用opencv自带的demo来进行测试,路径就是 /opt/opencv-4.1.2/samples/cpp/example_cmake/
,cd进去,在这里面有三个文件CMakeLists.txt
、example.cpp
、Makefile
,因为opencv是安装在此目录下的,且没有加环境变量的,所以无法直接make来使用Makefile的,可以按一下步骤来测试:
先修改
CMakeLists.txt
,要添加opencv的路径:
- vim CMakeLists.txt
- 在 find_package(OpenCV REQUIRED) 前添加路径
set(OpenCV_DIR /opt/opencv-3.4.13/install/share/OpenCV)
- mkdir build; cd build
- cmake ..; make // 编译
- ./opencv_example // 执行
Tips:
安装在自定义位置的时候也是可以设置OpenCV的环境变量,在~/.bashrc中加入这一句:
export OpenCV_DIR=/opt/opencv-4.5.3/install/lib64/cmake/opencv4
==windows下编译MinGW版本==(做个参考了解吧,编译出来,程序能编译,但是poweshell运行直接没反应,cmd运行一直会报“无法定位程序输入点于动态链接库…”的错误):
总结:
下面这种安装放弃了的,作为参考了解吧,主要是看它linux配置使用==pkgconfig环境==,若看pkgconfig与cmake的联合使用,看GCC编译器.md的4.6小节中的示例CMakeListst.txt:
一、以opencv-4.1.2为例,源码下载下来解压好
- cd opencv-4.1.2/
- mkdir build; cd build
- cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local .. # 这里一些选项开启
- make -j8
- make install
Tips:
/usr/local/
目录的include/
、bin/
、lib/
3个文件夹下;-D OPENCV_GENERATE_PKGCONFIG=ON
:OpenCV4
以上版本默认不使用pkg-config
,该编译选项开启生成opencv4.pc
文件,支持pkg-config
功能。二、配置pkgconfig环境
- find / -name opencv4.pc 应该会得到这个
/usr/local/lib64/pkgconfig/opencv4.pc
- vim /etc/profile.d/pkgconfig.sh // 可能是一个空文件,写进步骤3的内容
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
- source /etc/profile
- vim /etc/ld.so.conf.d/opencv4.conf // 可能是一个空文件,写入步骤2的内容
/usr/local/lib64
- ldconfig
成功后就可以查看opencv的版本:pkg-config --modversion opencv4
就会得到opencv的版本号 4.1.2;建议以后还是用这个版本吧,前面有用4.4.0版本,结合项目使用时,编译没问题,但是运行会报关于opencv的错误
三、测试demo
cd到 opencv-4.1.2/samples/cpp/example_cmake/文件夹下
因为opencv4.0需要c++11支持,且生成的pkg-config
文件名为opencv4.pc
,所以需要对当前录下的Malefile
文件进行修改,
原始Makefile内容的第2、3行内容如下:
CXXFLAGS += -c -Wall $(shell pkg-config –cflags opencv)
LDFLAGS += $(shell pkg-config –libs –static opencv)
要将其中的opecv
改成opencv4
,并指定--std=c++11
,那么修改后的就是:
CXXFLAGS += -c –std=c++11 -Wall $(shell pkg-config –cflags opencv4)
LDFLAGS += $(shell pkg-config –libs –static opencv4)
当把Makefile文件改完后,直接在此执行make
命令就可以得到执行文件了,当然也是可以用CMakeLists.txt通过cmake来构建。
Ps:以上的make编译的命令可以直接是:g++ example.cpp –std=c++11 ‘pkg-config –libs –cflags opencv4 -o opencv_example
// 注意:pkg-config --libs --cflags opencv4 是用键盘上ESC键位下的一对
`包住的,这里因为格式的问题,直接复制的是不对的,记得修改。
以后写关于使用了opencv的CMakeLists.txt时,记得去参考一下opencv的example中的写法,还是都加上Enable C++11
下面那两句(不是必须,但有时没有这两句编译又会报错,所以最好加上):
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
opencv4.pc中的内容,作为参考,以后有需要可自己写:
# Package Information for pkg-config
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib/x86_64-linux-gnu
includedir_old=${prefix}/include/opencv4/opencv
includedir_new=${prefix}/include/opencv4
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.2.0
Libs: -L${exec_prefix}/lib/x86_64-linux-gnu -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
同时把assimp库的“assimp.pc”内容也写这里吧:
libdir=/opt/assimp-5.2.5/my_install/lib64
includedir=/opt/assimp-5.2.5/my_install/include
Name: Assimp
Description: Import various well-known 3D model formats in an uniform manner.
Version: 5.2.4
Libs: -L${libdir} -lassimp
Libs.private: -lstdc++ -lz
Cflags: -I${includedir}
在一个简单的centos上进行如上操作是没有任何问题的,但是在T60服务器上,可能是因为装了anaconda后,部分环境变量优先级的问题,以上方法都通过不了。
当出现以下错误的时候,先试着去降低anaconda的环境变量的优先级,不行再按照以下方法去做。
第一步cmake命令cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..
不会出现异常,但是接下来的make编译的时候会报出如下错误:
/root/root/anaconda3/lib/libicui18n.so.58: undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8’
/root/root/anaconda3/lib/libicui18n.so.58: undefined reference to `operator delete(void*, unsigned long)@CXXABI_1.3.9’
# 当然前面路径可能不是这样
解决办法:
比较简单的(凡是带conda的错误都这样解决)
这去掉只针对这一个窗口,是临时去掉,只针对这个窗口,然后再去cmake、make。
以下的解决办法可行,但是比较麻烦,
- 网上找到错误原因是说——因为需要编译的时候链接到libstdc++6,那么这个问题的解决:
- yum whatprovides libstdc++.so.6 # 找到这个包的,然后下面安装
- yum install libstdc++-4.8.5-3.el6.i686 # 包名不一定是这个
- 以上步骤完成后,重新cmake,在那后面要加上
-DCMAKE_EXE_LINKER_FLAGS='-static-libstdc++'
,故现在cmake的全部命令是:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_EXE_LINKER_FLAGS='-static-libstdc++' ..
- 再重新执行cmake,可能会发现此刻第一步cmake都过不去了,在错误日志里可以找到一句错误——
cannot find -lstdc++
- 再解决就是
yum install -y glibc-static libstdc++-static
,然后再重新cmake按照前面的步骤走完,最后就能通过 cmake、make、make install 所有步骤
编译安装完成后,但可能还是无法编译通过opencv包里自带的一个demo实例(前面环境编译时多添加了一个参数,所以这里也需要添加),还需要做一些修改,有两种方式:
-DCMAKE_EXE_LINKER_FLAGS='-static-libstdc++'
,之后再make就可以了。-static-libstdc++
,将原有的
LDFLAGS += $(shell pkg-config –libs –static opencv4)改为:
LDFLAGS += -static-libstdc++ $(shell pkg-config --libs --static opencv4)
,然后直接make就可以了。这是learnOpenCV项目中的,地址。
ubuntu一定要安装到 “/usr/local” 下面,用户的访问才会很方便,其它位置可能有问题。
最好是自己先去建一个 /usr/local/opencv版本号 的目录,然后cmake时就把这个路径指定位安装路径
#!/bin/bash
echo "OpenCV installation by learnOpenCV.com"
# Define OpenCV Version to install
cvVersion="master"
# Clean build directories
rm -rf opencv/build
rm -rf opencv_contrib/build
# Create directory for installation
mkdir installation
mkdir installation/OpenCV-"$cvVersion"
# Save current working directory
cwd=$(pwd)
sudo apt -y update
sudo apt -y upgrade
sudo apt -y remove x264 libx264-dev
## Install dependencies
sudo apt -y install build-essential checkinstall cmake pkg-config yasm
sudo apt -y install git gfortran
sudo apt -y install libjpeg8-dev libpng-dev
sudo apt -y install software-properties-common
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt -y update
sudo apt -y install libjasper1
sudo apt -y install libtiff-dev
sudo apt -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt -y install libxine2-dev libv4l-dev
cd /usr/include/linux
sudo ln -s -f ../libv4l1-videodev.h videodev.h
cd "$cwd"
sudo apt -y install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt -y install libgtk2.0-dev libtbb-dev qt5-default
sudo apt -y install libatlas-base-dev
sudo apt -y install libfaac-dev libmp3lame-dev libtheora-dev
sudo apt -y install libvorbis-dev libxvidcore-dev
sudo apt -y install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt -y install libavresample-dev
sudo apt -y install x264 v4l-utils
# Optional dependencies
sudo apt -y install libprotobuf-dev protobuf-compiler
sudo apt -y install libgoogle-glog-dev libgflags-dev
sudo apt -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen
sudo apt -y install python3-dev python3-pip
sudo -H pip3 install -U pip numpy
sudo apt -y install python3-testresources
cd $cwd
############ For Python 3 ############
# create virtual environment
python3 -m venv OpenCV-"$cvVersion"-py3
echo "# Virtual Environment Wrapper" >> ~/.bashrc
echo "alias workoncv-$cvVersion=\"source $cwd/OpenCV-$cvVersion-py3/bin/activate\"" >> ~/.bashrc
source "$cwd"/OpenCV-"$cvVersion"-py3/bin/activate
# now install python libraries within this virtual environment
pip install numpy scipy matplotlib scikit-image scikit-learn ipython dlib --user
# quit virtual environment
deactivate
######################################
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout $cvVersion
cd ..
git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout $cvVersion
cd ..
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$cwd/installation/OpenCV-"$cvVersion" \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
-D OPENCV_PYTHON3_INSTALL_PATH=$cwd/OpenCV-$cvVersion-py3/lib/python3.6/site-packages \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..
make -j$(nproc)
make install
这是mediapipe中的,也可以好好参考。
#!/bin/bash
# Copyright 2019 The MediaPipe Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# =========================================================================
#
# Script to build OpenCV from source code and modify the MediaPipe opencv config.
# Note that this script only has been tested on Debian 9 and Ubuntu 16.04.
#
# To have a full installation:
# $ cd <mediapipe root dir>
# $ sh ./setup_opencv.sh
#
# To only modify the mediapipe config for opencv:
# $ cd <mediapipe root dir>
# $ sh ./setup_opencv.sh config_only
set -e
if [ "$1" ] && [ "$1" != "config_only" ]
then
echo "Unknown input argument. Do you mean \"config_only\"?"
exit 0
fi
opencv_build_file="$( cd "$(dirname "$0")" ; pwd -P )"/third_party/opencv_linux.BUILD
workspace_file="$( cd "$(dirname "$0")" ; pwd -P )"/WORKSPACE
if [ -z "$1" ]
then
echo "Installing OpenCV from source"
if [[ -x "$(command -v apt)" ]]; then
sudo apt update && sudo apt install build-essential git
sudo apt install cmake ffmpeg libavformat-dev libdc1394-22-dev libgtk2.0-dev \
libjpeg-dev libpng-dev libswscale-dev libtbb2 libtbb-dev \
libtiff-dev
elif [[ -x "$(command -v dnf)" ]]; then
sudo dnf update && sudo dnf install cmake gcc gcc-c git
sudo dnf install ffmpeg-devel libdc1394-devel gtk2-devel \
libjpeg-turbo-devel libpng-devel tbb-devel \
libtiff-devel
fi
rm -rf /tmp/build_opencv
mkdir /tmp/build_opencv
cd /tmp/build_opencv
git clone https://github.com/opencv/opencv_contrib.git
git clone https://github.com/opencv/opencv.git
mkdir opencv/release
cd opencv_contrib
git checkout 3.4
cd ../opencv
git checkout 3.4
cd release
cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_ts=OFF \
-DOPENCV_EXTRA_MODULES_PATH=/tmp/build_opencv/opencv_contrib/modules \
-DBUILD_opencv_aruco=OFF -DBUILD_opencv_bgsegm=OFF -DBUILD_opencv_bioinspired=OFF \
-DBUILD_opencv_ccalib=OFF -DBUILD_opencv_datasets=OFF -DBUILD_opencv_dnn=OFF \
-DBUILD_opencv_dnn_objdetect=OFF -DBUILD_opencv_dpm=OFF -DBUILD_opencv_face=OFF \
-DBUILD_opencv_fuzzy=OFF -DBUILD_opencv_hfs=OFF -DBUILD_opencv_img_hash=OFF \
-DBUILD_opencv_js=OFF -DBUILD_opencv_line_descriptor=OFF -DBUILD_opencv_phase_unwrapping=OFF \
-DBUILD_opencv_plot=OFF -DBUILD_opencv_quality=OFF -DBUILD_opencv_reg=OFF \
-DBUILD_opencv_rgbd=OFF -DBUILD_opencv_saliency=OFF -DBUILD_opencv_shape=OFF \
-DBUILD_opencv_structured_light=OFF -DBUILD_opencv_surface_matching=OFF \
-DBUILD_opencv_world=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_xphoto=OFF \
-DCV_ENABLE_INTRINSICS=ON -DWITH_EIGEN=ON -DWITH_PTHREADS=ON -DWITH_PTHREADS_PF=ON \
-DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON
make -j 16
sudo make install
rm -rf /tmp/build_opencv
echo "OpenCV has been built. You can find the header files and libraries in /usr/local/include/opencv2/ and /usr/local/lib"
# https://github.com/cggos/dip_cvqt/issues/1#issuecomment-284103343
sudo touch /etc/ld.so.conf.d/mp_opencv.conf
sudo bash -c "echo /usr/local/lib >> /etc/ld.so.conf.d/mp_opencv.conf"
sudo ldconfig -v
fi
# Modify the build file.
echo "Modifying MediaPipe opencv config"
sed -i '/linkopts/a \ \ \ \ \ \ \ \ \"-L/usr/local/lib",' $opencv_build_file
linux_opencv_config=$(grep -n 'linux_opencv' $workspace_file | awk -F ":" '{print $1}')
path_line=$((linux_opencv_config + 2))
sed -i "$path_line d" $workspace_file
sed -i "$path_line i\ path = \"/usr/local\"," $workspace_file
echo "Done"
cmake就这样安装吧,通过yum或者apt-get安装的版本太低了,基本安装后也要这样升级。
cmake的下载地址:这里。
/opt/cmake-3.13.3-Linux-x86_64/bin
的路径写进PATH环境变量就可以了(主要要带linux,不然就是下的源码了)。gcc的下载地址:这里。
说明:一般装的centos7.*,原生的gcc –version == 4.8.5; g++ –version == 4.8.5(跟gcc一样的)
当gcc版本低于4.9的时候,是不支持c++14的,很多时候make就会报错(详细的关于gcc版本支持的c++版本的对应关系:这里);然后就需要升级gcc,具体的方法:
在线升级方法参见这里;
Tips:这条激活命令只对本次会话有效,重启会话后还是会变回原来的4.8.5版本,要想随意切换可按如下操作:
首先,安装的devtoolset是在 /opt/rh 目录下的,每个版本的目录下面都有个
enable
文件,如果需要启用某个版本,只需要执行,source ./enable
,为了避免每次启动都执行,可将其写进配置文件。vim ~/.bashrc source /opt/rh/devtoolset-8/enable # 此句话是写进~/.bashrc的内容,写完后保存退出 source ~/.bashrc
若是想直接替换旧的gcc
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++
当升级完成后,随便写一个简单的.cpp文件以c++14去编译,可能会出现如下错误:
error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file
,根据这里去解决就好了。
可能后面会遇到库的版本问题,就建议这样:
mv /usr/lib/gcc/ /usr/lib/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/usr/lib/gcc /usr/lib/gcc
mv /usr/libexec/gcc/ /usr/libexec/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/usr/libexec/gcc /usr/libexec/gcc
如果是linux系统,先网上搜索直接通过yum或是apt-get安装吧,简单快捷,第一次可以这么直接安装一个版本,后面要安装新版本的,就还是源码来,也挺简单的。
首先上boost的官网,历史版本,下载系统对应的压缩包。
一个注意点,有的cmake版本比较低的话,其自带的FindBoost.cmake里面可以看到支持的Boost版本可能不支持最新的,可能就需要安装低一点的版本。
1.75还有1.78这种版本里面是有*.cmake文件的,然后我下载的1.65是没有*.cmake文件的,所以老版本就写进/etc/profile.d/Boost.sh文件里,新版本就直接在~/.bashrc里面export Boost_DIR变量。
# cmake笔记中有更细的内容
set(Boost_DIR /opt/boost_1_76_0/install/lib/cmake/Boost-1.76.0)
find_package(Boost 1.16.1 REQUIRED COMPONENTS filesystem system)
./bootstrap.sh
;./b2 install --prefix=./my_install
, # 安装在当前压缩目录下的my_install里使用:也大多为cmake调用,BoostConfig.cmake
文件所在路径/opt/boost_1_76_0/install/lib/cmake/Boost-1.76.0/
,直接在CMakeLists.txt中set指定此路径就好了,语句为:
set(Boost_DIR /opt/boost_1_76_0/my_install/lib/cmake/Boost-1.76.0/)
。
更好的方式是直接添加环境变量:
vim ~/.bashrc
export Boost_DIR=/opt/boost/boost_1_78_0/my_install/lib/cmake/Boost-1.78.0
source ~/.bashrc
以下tips仅供参考,(没有CmakeLists.txt这么用吧),
Tips:网上还有建议说,为了方便使用,直接自动获取,而不通过set指定,就需要添加环境变量(这就比较建议新一个新文件vim /etc/profile.d/Boost.sh,然后把西面的内容放进去):(==这个很实用,特别是一些自库用自带的Makefiles构建的时候,设置了的类似于Boost_DIR对它是不管用的,需要以下面的方式去指定头文件路径==)
boost_dir=/opt/boost_1_76_0/my_install
export CPLUS_INCLUDE_PATH=${boost_dir}/include:$CPLUS_INCLUDE_PATH # 这应该是c++程序的头文件搜索路径
export LIBRARY_PATH=${boost_dir}/lib:$LIBRARY_PATH # 这应该是静态库地址
export LD_LIBRARY_PATH=${boost_dir}/lib:$LD_LIBRARY_PATH # 后面这个就是动态库的路径
它的cmake文件是:BoostConfig.cmake
假定其版本是1.76.0,解压后会得到boost_1_76_0
这样的文件
bootstrap.bat
,就会生成b2.exe
;b2.exe
使用:我主要是cmake的调用,其BoostConfig.cmake
文件所在的路径大致为your_path\boost_1_76_0\stage\lib\cmake\Boost-1.76.0
。
特别注意:==这是vs的版本,只能给vs使用,在win下使用cmake生成mingw的项目,调用这个是不行的==。
Tips(以下tips仅供参考,我并未使用验证过,):在安装结束后,一般会有一个提示,如下:
your_path\boost_1_76_0
;your_path\boost_1_76_0\stage\lib
。==好像Boost的.cmake文件不是很好用,设定了一样会报错,就直接这样把头文件、库文件搜索路径添加进去就好了==。
以上是安装vs的版本,直接powershell安装的话,它默认就是安装的MSVC版本(这点不是很确定),如果我们需要其它版本,比如MinGW的话,很上面的操作类似:
bootstrap.bat
,就会生成b2.exe
;谷歌的protobuf,主要用于结构化数据的序列化和反序列化,应该也是可以直接使用yum、apt-get安装,也可以下面的源码。
c++主要是使用PROTOBUF_GENERATE_CPP()
函数
下载地址:这里。
就可以使用cmake了吧(直接用命令往里添加),当然也可以直接配置到环境变量,建议看这里。
有关Protobuf的一个错误:
cmake的时候可能会出现这样的错误:Could NOT find Protobuf (missing: Protobuf_LIBRARIES Protobuf_INCLUDE_DIR)
,在CMakeLists.txt中应该也会找到一行类似:find_package(Protobuf REQUIRED),那这种错误就是缺乏相应的依赖,解决办法:
- yum search Protobuf #会得到很多与之相关的依赖,一般就是选
protobuf-devel.x86_64
- yum install protobuf-devel.x86_64
Ps:在搜索出来的结果里可以看到从依赖后面会有解释,说明该依赖是c++的头文件及函数库。
gstreamer官方地址,然后它下载的源码应该是.tar.xz格式的,需要先使用xz命令做一下解压xz -d gstreamer-1.19.3.tar.xz
(直接使用tar -Jxvf .tar.xz就行了)。这是官方demo地址。
然后这个版本问题,我试了1.15版本就还是用的configure,然后1.18以及1.19都是用的meson.build来构建的。
安装:
首先下载MSVC或者MinGW编译好的包(.msi文件),通过.msi文件先安装,安装的时候选择custom,把所有的都选上。一般类似有这四个文件 gstreamer-1.0-mingw-x86_64-1.19.3.msi gstreamer-1.0-devel-mingw-x86_64-1.19.3.msi
gstreamer-1.0-msvc-x86_64-1.19.3.msi gstreamer-1.0-devel-msvc-x86_64-1.19.3.msi
添加环境变量:这个gstreamer有很多自带的.dll动态库,一定要把只写动态库所在路径(好比这D:\gstreamer\1.0\msvc_x86_64\bin)添加到Path系统环境变量中,不然编译成功后,在程序执行时会报很多.dll找不到的错误。
使用:
方式一:就是使用里面bin目录下的二进制文件,用法似乎跟ffmpeg差不多就都是命令行,主要是 gst-launch-1.0.exe 这个命令。
file:///
+视频文件的绝对路径,不能是相对路径),错了就放不了。方式二:使用这个环境来编译项目。
可以直接cmake命令行来构建,(示例CMakeListst.txt在GCC编译器.md的4.6小节中)。
若是想把环境直接添加到vs中使用而不是cmake项目的话,也要先通过cmake的输出来确定有哪些头文件路径、库文件需要添加,然后按照visual studio使用.md中添加配置就好。
为了后续方便参考,把跑通的demo里的配置写一下: 添加了如下头文件路径:
D:/lib/gstreamer/1.0/msvc_x86_64/include/gstreamer-1.0
D:/lib/gstreamer/1.0/msvc_x86_64/include
D:/lib/gstreamer/1.0/msvc_x86_64/include/glib-2.0
D:/lib/gstreamer/1.0/msvc_x86_64/lib/glib-2.0/include
添加的库路径:D:\lib\gstreamer\1.0\msvc_x86_64\lib
库名:gstreamer-1.0.lib;gobject-2.0.lib;glib-2.0.lib;intl.lib
一:sudo apt-get install libgstreamer*
二:或者如下(优先使用这种吧,很仓促临时弄的时候可以用上面那个):
sudo apt-get install build-essential libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-qt5 gstreamer1.0-pulseaudio -y
直接运行如下命令:
yum install gstreamer1 gstreamer1-plugins-base gstreamer1-plugins-good gstreamer1-plugins-bad-free gstreamer1-plugins-ugly-free gstreamer1-rtsp-server gstreamer1-svt-av1 json-glib openssl libuuid gstreamer1-plugins-base-devel json-glib-devel opencv-devel jansson-devel openssl-devel libuuid-devel gcc -y
说明:这是安装deepstreamer之前必要的环境(其实这安装完后,理论上是可以直接运行deepstreamer的demo的)。当然这样做后,也是可以直接运行通过gstreamer的demo的。
尽量不要自己源码编译了,始终有问题,这之所以还写,就是里面的编译发方法,以后应该还会遇到,涉及到直接使用./configure
以及meson.build
,所以放这了解:
gstreamer不同的版本,有两种方式:一种是里面有可执行文件./configure用它来配置的,另外一种是用python的项目meson(一般要python3.5以上)来构建的。
首先安装依赖:
以上这两个是必须的,没有的话,./configure都过不去
yum install libunwind-devel.x86_64 # 安装时最好都招带devel的安装包
这一个不是必须的,但是加上,万一后面用得上。
==方式一==:configure
==方式二==:meson(这里有meson.build文件,小说明)
环境配置:这两种方式都需要配置pkgconfig环境,按照上面opencv的来。
- vim /etc/profile.d/pkgconfig.sh
写入:export PKG_CONFIG_PATH=/opt/install/lib64/pkgconfig:$PKG_CONFIG_PATH # 前面是安装路径
然后: source /etc/profile
- vim /etc/ld.so.conf.d/gstreamer-1.0.conf
- 注意:gstreamer-1.0.conf是由gstreamer-1.0.pc决定的
写入:/opt/install/lib64
然后:ldconfig
官方demo,建议使用官方的例子2:
写一个basic-tutorial-2.c
文件(注意一定是要.c,特别是在vs中)来测试,内容如下:(之所以要.c用c语言编译,是因为第38行。若改成msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, static_cast<GstMessageType>(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));就可以使用c++了,因为c++这里不能自动转换类型,要手动转换,而C可以)
#include <stdio.h>
#include <gst/gst.h>
int main(int argc, char *argv[]) {
printf("hello world! \n");
GstElement *pipeline, *source, *sink;
GstBus *bus;
GstMessage *msg;
GstStateChangeReturn ret;
/* Initialize GStreamer */
gst_init(&argc, &argv);
/* Create the elements */
source = gst_element_factory_make("videotestsrc", "source");
sink = gst_element_factory_make("autovideosink", "sink");
/* Create the empty pipeline */
pipeline = gst_pipeline_new("test-pipeline");
if (!pipeline || !source || !sink) {
g_printerr("Not all elements could be created.\n");
return -1;
}
/* Build the pipeline */
gst_bin_add_many(GST_BIN(pipeline), source, sink, NULL);
if (gst_element_link(source, sink) != TRUE) {
g_printerr("Elements could not be linked.\n");
gst_object_unref(pipeline);
return -1;
}
/* Modify the source's properties */
g_object_set(source, "pattern", 0, NULL);
/* Start playing */
ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
if (ret == GST_STATE_CHANGE_FAILURE) {
g_printerr("Unable to set the pipeline to the playing state.\n");
gst_object_unref(pipeline);
return -1;
}
/* Wait until error or EOS */
bus = gst_element_get_bus(pipeline);
msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
/* Parse message */
if (msg != NULL) {
GError *err;
gchar *debug_info;
switch (GST_MESSAGE_TYPE(msg)) {
case GST_MESSAGE_ERROR:
gst_message_parse_error(msg, &err, &debug_info);
g_printerr("Error received from element %s: %s\n",
GST_OBJECT_NAME(msg->src), err->message);
g_printerr("Debugging information: %s\n",
debug_info ? debug_info : "none");
g_clear_error(&err);
g_free(debug_info);
break;
case GST_MESSAGE_EOS:
g_print("End-Of-Stream reached.\n");
break;
default:
/* We should not reach here because we only asked for ERRORs and EOS */
g_printerr("Unexpected message received.\n");
break;
}
gst_message_unref(msg);
}
/* Free resources */
gst_object_unref(bus);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
return 0;
}
g_object_set(source, “pattern”, 0, NULL); // 还有其它图案可以查看,把0改成其它数字,具体有这(此页面的最底部)。
再来一个简单的流的播放例子demo:
#include <gst/gst.h>
int main(int argc, char* argv[]) {
GstElement *pipeline;
GstBus *bus;
GstMessage *msg;
/* Initialize */
gst_init(&argc, &argv);
/* Build */
pipeline = gst_parse_launch("playbin uri=rtsp://192.168.108.11:554/user=admin&password=&channel=1&stream=1.sdp?", NULL);
/* start playing */
gst_element_set_state(pipeline, GST_STATE_PLAYING);
/* Wait ubtil error or EOS */
bus = gst_element_get_bus(pipeline);
msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
// 这行代码这样改,就可以用g++编译了:
// msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, static_cast<GstMessageType>(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));
/* */
if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR) {
g_error("An error occurred! Re-run with the GST_DEBUG=*:WARN environment variable set for more details.");
}
/* free resources */
gst_message_unref(msg);
gst_object_unref(bus);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
return 0;
}
编译:
pkg-config --cflags --libs gstreamer-1.0
` (这里多一个,为了它显示出来而已)(若要debug,且能显示源码,记得加-g)Tips:
然后官方例子1basic-tutorial-1.c
的内容,要注意uri对于网络视频地址和本地视频文件之间不同的写法:
// 这是播放网络资源
pipeline = gst_parse_launch(“playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm”,NULL);
// 这是播放本地视频,file后面两个斜杠,后面是绝对路径 // pipeline = gst_parse_launch(“playbin uri=file:///home/sh/Desktop/sintel_trailer-480p.webm”,NULL); // windows上的写法是,file:/// 注意是三个斜杠 // pipeline = gst_parse_launch(“playbin uri=file:///C:/Users/Administrator/Videos/sintel_trailer-480p.webm”, NULL);
命令行拉流:gst-launch-1.0 playbin uri=”rtsp://192.168.108.11:554/user=admin&password=&channel=1&stream=1.sdp?” # 感觉无论是命令行还是代码,延迟都很大啊
结合自己写的博客看吧。(还有一定注意版本3、4有些不一样,在ffmpeg读流展示那里有写)
备注:自己在centos上编译的,bin里面的命令工具可以直接使用,但是可能因为编译时一些开关没有设置好,用include、lib做代码开发的时候有些问题,所以直接用github上编译好的包吧(带shared的才是有头文件、库文件的)。这里也是预编译好的
说一下,现在大版本3构建的会有ffserver(它的使用可以参考一下这里,但不是很好用,官方都移除了,还是用srs吧),然后在版本4里面已经被移除了;
建议还是下载源码自己编译:(这里更多的是针对FFmpeg-n3.4.9这个版本在centos上)
Tips:
在执行./configure是可能报错,“nasm/yasm not found or too old. ”那是因为yasm是汇编编译器,ffmpeg为了提高效率使用了汇编指令,所以就yum install yasm就可以了。
源码安装的,可能一般都没有ffplay这个二进制文件,可以在文件 ffbuild/config.mak 看到这一行(版本3的是直接在config.mak) !CONFIG_FFPLAY=yes 前面是一个感叹号的,这是因为缺少两个库,==sdl1.2==、==sdl2.0==
解决办法(针对ubuntu, centos一般是命令行,就不需要ffplay): sudo apt-get install libsdl1.2-dev
sudo apt install libsdl2-dev
总而言之,如果是命令行,就不要管这个了,也用不到ffplay,如果是图形化界面的话,编译前先安装这两个库,直接一次到位。
其它方式:
- 先安装epel扩展源 :yum -y install epel-release
- 安装其它扩展源:
yum localinstall –nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
yum localinstall –nogpgcheck https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm
rpm -import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
- 最后安装ffmpeg:yum -y install ffmpeg ffmpeg-devel ffmpeg-libs.x86_64
vulkan与OpenGL的区别,这里。vulkan主要是想来取代OpenGL。
前面主要尝试了两种:
一种是直接安装vulkan软件,直接使用里面的lib库,然后把路径添加到vs中,进行编译使用,教程在这里,比较简单。
另一种是github上的一个关于vulkan的完整demo,它把需要用到的三方库都包含进来了,直接按其官方教程进行cmake配置好(注意指定为win64,不然好像是默认的win32,后面vs编译时就会出错),vs打开编译就好了。下面简单写下过程,以作参考:
vcg库是在编译openMVS时是要的,它也是opneMVS的作者开源的,好像是head-only。
安装: