文章目录
环境
- Windows
- Qt5
- Cmake
- Opencv
- ffmpeg
下载
qt5下载,参考如下链接的说明:QT5下载
Opencv下载:Opencv
Cmake下载:CMake
ffmpeg下载:ffmpeg / 官网
官网可以下载更多release 版本。
下载Cmake,二进制执行文件即可。
下载Opencv
下载ffmpeg,这里选择windows builds from gyan.dev
选择 release builds.
点击下载需要的版本,比如ffmpeg-release-full shared。
安装opencv
配置环境变量
- 运行Cmake执行程序进行安装,根据自己情况选择适合安装的位置。
- 解压Opencv,存放在适当位置即可。
完成环境变量配置后,重启电脑使其生效。
编译opencv
- Configure 配置
完成上图后,点击configure.
选择MinGW Makefile和“Specify native compilers”->next.
选择编译工具如下:
[C] D:\xxx\Qt\Qt5.12.9\Tools\mingw730_64\bin\gcc.exe
[C++] D:\xxx\Qt\Qt5.12.9\Tools\mingw730_64\bin\g++.exe
点击finish,会自动构建。- 选择特定flag
构建完成后,在界面红勾选“WITH_1394”, “WITH_OPENGL”, “WITH_QT”, “WITH_OPENMP” ,点击configure,完成后,标红的部分基本已经消失。
- 选择特定flag
- generate 生成makefile
点击generate。 - 打开Power shell
进入E:\lib\opencv\opencv-build路径下,运行mingw32-make -j 4 (-j 线程数查看自己处理器的线程数,提高编译速度),不出错的话,完成运行后,运行mingw32-make install完成安装。
进入install找到如下图所示路径添加到环境变量,重启电脑。
ffmpeg 配置
参考:VS2019配置ffmpeg4.4 非常详细
下面是一些摘要:
windows下,配置环境变量:
将上面路径配置到环境变量,重启电脑后生效。
cmd,输入ffmpeg -version 如下所示:
Qt 导入ffmepg
这里选择动态库,将解压后的ffmpeg 目录下include和bin目录放置在自己的工程目录。
.pro 文件导入:
INCLUDEPATH += $$PWD/ffmpeg5.0.1/include
LIBS += $$PWD/ffmpeg5.0.1/bin/av*.dll \
$$PWD/ffmpeg5.0.1/bin/sw*.dll \
$$PWD/ffmpeg5.0.1/bin/pos*.dll
测试程序
- 新建Qt项目kit配置
如果Qt本地安装了多个编译器,则需要选择MinGW 64-bit编译器。
采用opencv打开一张图片
-
需要将opencv头文件以及库文件路径添加到.pro配置中。
-
main.cpp
#include <QDebug>
#include <QFile>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#define EN 1
using namespace cv;
int main(int argc, char *argv[])
{
#if EN
QFile file(":/local_temp/2.png");
if(!file.open(QFile::ReadOnly))
{
qDebug() << "read file failed!"<<endl;
return 0;
}
QByteArray byteData = file.readAll();
Mat mImage =imdecode(vector<char> (byteData.begin(), byteData.end()), 1);
#elif
Mat mImage = imread(":/local_temp/2.png");//opencv无法直接使用":/xxx/xx.png"资源文件 \
路径读取图片,可以采用imdecode方法,当然如果采用绝对路径可以使用imread
#endif
namedWindow("pitest", CV_WINDOW_AUTOSIZE);
imshow("pitest", mImage);
cv::waitKey(0);//任意键结束
file.close();
return 0;
}
- 坑1
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow
使用imread()时,路径需要使用绝对路径 或者 采用上面的资源文件的方式
Qtcreator 新增组建
在如下目录打开MaintenanceTool.exe
D:\xxx\Qt\Qt5.12.9
打包与运行
windows (单个exe)
可以将exe和所需要的库文件打包到一个exe文件中,使用enigmavb.exe。
windows xxx(安装包)
- 采用windeployqt.exe 为exe文件找到相应库,运行exe出现以下问题:
Q1: 无法定位程序输入点_ZdaPvj于动态链接库
Q2: 程序无法正常启动0xc000007b
Q3: 其他与exe相关的错误等。
A: 采用Qt自带的cmd窗口用windeployqt.exe 为exe找相应库
问题解决。
linux xxxx
- 编译出可执行文件
- 找到lib文件
- 打包运行
参考https://blog.csdn.net/xx970829/article/details/115023991
- 找lib 文件
1.在桌面新建一个文件夹 floder,还有两个sh文件(copylib.sh、outext.sh)
//copylib.sh
#!/bin/bash
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done
//outext.sh
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
- 去Qt 安装目录下找platforms文件夹,将该文件夹拷贝到floder下;
- 找可执行程序所涉及的lib,将copylib.sh放到“执行程序”所在路径,然后授权,执行
chmod 777 copylib.sh
./copylib.sh out.a //out.a改成自己的可执行文件名
将执行完毕后产生的lib下的所有文件拷贝到floder下;
4. 将copylib.sh放到platforms下
chmod 777 copylib.sh
./copylib.sh libqxcb.so
同样,将执行完毕后产生的lib下的所有文件拷贝到floder下;
5. 以上步骤已经将所有涉及到的lib备齐,将floder放在其他ubuntu下,执行outexe.sh
chmod -R 777 outexe.sh
./outexe.sh
- 打包成可执行文件,用户双击就可以运行
新建快捷访问,如run.desktop
[Desktop Entry]
Encoding=UTF-8
Name=clientRo //快捷方式的名字
Comment=testPrograme
Exec=/home/test/Desktop/floder/outexe.sh //.sh 运行脚本文件
Icon=/home/test/Desktop/01.png //快捷方式的图标
Terminal=false
StartupNotify=true
Type=Application
Categories=Application;Development;
经过如上步骤或许运行不起来,如下设置即可。
6. 允许程序作为可执行程序:右键快捷方式,属性->权限,勾选“allow executing file as program”
7. 勾选“可执行文件作为文本文件时执行他们”
问题总结
- error while loading shared libraries
/*
问题原因:系统找不到xxx.so 存放在那个目录,需要将.so所在目录加入到/etc/ld.so.conf中
1.打开/etc/ld.so.conf最后一行加入.so目录
2.运行/sbin/ldconfig -v 配置即可
*/
shell
- 启动某个路径下的程序
采用/bin/bash ,否则${DIRNAME:0:1}无法解析
#!/bin/bash
DIRNAME=$0
if [ "${DIRNAME:0:1}" = "/" ];then
CURDIR=`dirname $DIRNAME`
else
CURDIR="`pwd`"/"`dirname $DIRNAME`"
fi
echo $CURDIR
#kill all history records about serverApp process
ps -ef |grep spp | grep -v grep | awk '{print $2}' | xargs kill -9
$CURDIR/serverApp &
$CURDIR/application
#kill all history records about serverApp process
ps -ef |grep spp | grep -v grep | awk '{print $2}' | xargs kill -9
/*
$0: shell 脚本自身的名字
dirname $0 : 脚本自身所在的相对路径
ps -ef | grep spp : 查找所有spp进程
grep -v grep : 过滤掉包含grep的进程
提取找到记录中第二列的参数,所有进程号
xargs kill -9: 将前面的参数都传递给kill -9
*/
ffmpeg 用法
常用命令
//查看设备所支持的格式
ffmpeg -devices
//播放音频文件test.pcm
ffplay -ar 44100 -ac 2 -f s16le test.pcm