一、前言
在项目开发过程中,经常需要用到第三方库,需要在QtCreator工程里指定第三库的路径、头文件路径、引用的库名称等等;并且可能还需要编写通用工程针对不同的编译器类型,位数选择不同的库,针对不同的操作系统环境选择不同的库;那么这些条件的区分都可以在QtCreator的pro工程文件里编写逻辑实现。
下面就介绍常用的添加库、头文件的方法,以libvlc、ffmpeg、opencv等常用的第三方库作为示例,编译器分别选择VS2017(32位)、MinGW(32位)进行测试。
二、添加第三方库与头文件
下面的例子里,第三方库、头文件都放在工程目录下,代码里路径直接用$$PWD
取当前路径,再接库目录的路径。 程序测试的环境是win10(64bit)、Qt5.12.6
说明: 添加路径的时候左斜杠
、右斜杠
都是可以支持的。/
2.1 引用libvlc库示例
MSVC、MinGW编译器都可使用 在编译完成之后,需要把用到的动态库.dll文件拷贝到可执行文件exe同级目录下才能正常运行。
代码语言:javascript复制INCLUDEPATH = $$PWDVLCsdkinclude #VLC头文件包含目录
INCLUDEPATH = $$PWDVLCsdkincludevlcplugins #VLC头文件包含目录
INCLUDEPATH = $$PWDVLCsdkincludevlc #VLC头文件包含目录
LIBS =$$PWDVLCsdkliblibvlc.lib #引用的VLC库文件
LIBS =$$PWDVLCsdkliblibvlccore.lib
小知识: MSVC编译器使用libvlc库编译时需要在#include <vlc/vlc.h>
之前,定义typedef __int64 ssize_t;
否则可能会报一堆未定义的错。 可以直接把typedef __int64 ssize_t;
写在#include <vlc/vlc.h>
上面一句。
代码里引用libvlc需要包含的头文件:
代码语言:javascript复制#include <vlc/vlc.h>
libvlc的测试代码: 打印库的版本
代码语言:javascript复制qDebug()<<"libvlc版本:"<<libvlc_get_version();
//打印结果: libvlc版本: 3.0.12 Vetinari
2.2 引用ffmpeg库示例
(1). 方式1:适用于mingw、MSVC编译器
代码语言:javascript复制INCLUDEPATH =$$PWD/ffmpeg/include
LIBS = -L$$PWD/ffmpeg/lib/ -lavcodec -lavdevice -lavfilter -lavformat -lavutil -lpostproc -lswresample -lswscale
DEPENDPATH = $$PWD/ffmpeg/lib
(2). 方式2: 适用于mingw、gcc
代码语言:javascript复制INCLUDEPATH =$$PWD/ffmpeg/include
LIBS =$$PWD/ffmpeg/bin/av*
LIBS =$$PWD/ffmpeg/bin/sw*
LIBS =$$PWD/ffmpeg/bin/pos*
代码里引用ffmpeg需要包含的头文件:
代码语言:javascript复制//声明引用C的头文件
extern "C"
{
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <libavutil/avassert.h>
#include <libavutil/channel_layout.h>
#include <libavutil/opt.h>
#include <libavutil/mathematics.h>
#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
#include "libavfilter/avfilter.h"
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/opt.h"
}
ffmpeg的测试代码: 打印库的版本
代码语言:javascript复制const char *p=av_version_info();
qDebug("%sn",p);
2.3 引用opencv库示例
方式1: 适用于gcc、mingw
代码语言:javascript复制#linu平台的路径设置
linux {
message('运行linu版本')
#添加opencv头文件的路径,需要根据自己的头文件路径进行修改
INCLUDEPATH =/home/wbyq/work_pc/opencv-3.4.9/_install/install/include
/home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv
/home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv2
LIBS =/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_*
}
win32
{
message('运行win32版本')
#添加opencv头文件的路径,需要根据自己的头文件路径进行修改
INCLUDEPATH =C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include
C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include/opencv
C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include/opencv2
LIBS =C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/x86/mingw/bin/libopencv_*.dll
}
小知识: 适用于mingw编译器的OpenCV库去这里下载: https://github.com/huihut/OpenCV-MinGW-Build
方式2: 适用于MSVC编译器–64位 opencv官网地址: https://opencv.org opencv 2.x 才有X86的库,从3.X开始就只有X64的库了,3.X的版本编译只需要加一个库非常方便;下面的代码示例就是使用的opencv3.4.x的库,MSVC编译器选择的是VS2017 64bit。
代码语言:javascript复制INCLUDEPATH = $$PWD/opencv/build/include
INCLUDEPATH = $$PWD/opencv/build/include/opencv
INCLUDEPATH = $$PWD/opencv/build/include/opencv2
LIBS = -L$$PWD/opencv/build/x64/vc14/lib
-lopencv_world320d