QtCreater的编译模式有msvc和mingw两种,msvc调用的第三方库是.lib结尾的,而mingw调用的库是.a结尾的。在windows下下载的QGIS开发包中的库文件是.lib库,所以,在QtCreater中直接使用下载的QGIS库只能采用msvc编译模式(至于mingw下调用.lib库比较麻烦,而且容易出各种问题,在此不做深入讨论),本文主要说明使用msvc编译模式下的环境搭建方法。
准备工作:
1.双击vs_Community.exe,开始安装vs2017
选中“使用C++的桌面开发”,右下角选择“下载完后安装”,点击安装按钮开始安装。大约20-30分钟左右。
2.安装完毕后,vs默认未安装调试器,需要手动安装,否则Qt安装完成后MSVC的debugger缺失。安装步骤如下:
打开控制面板程序,找到“Windows Software Development Kit –Windows 10.0xxxx”,鼠标右键,选择“更改”
在弹出的安装程序中,选择“Change”,点击“Next”按钮
在窗口中勾选“Debugging Tools for Windows”,然后点击“Change”按钮(因为我是安装完后截的图,所以“Change”按钮是灰色的),等待安装完成即可。
1.双击安装程序开始安装,默认安装在C盘,一直下一步即可。在选择组件部分根据自己的需要选择,简单说一下各组件含义:
Qt5.12.6下时Qt的组件,msvc是msvc编译模式下所需要的库文件,mingw是mingw编译模式下所需的库文件,后面分别是ARM和安卓开发所需要的库文件。
Developer and Designer Tools是开发工具。
在此处,只需要安装msvc2017 64-bit和QtCreater即可(因为我使用的是64位QGIS,所以此处选择64位msvc库,其它组件根据需要选择是否安装,勾选mingw只是因为个人想在其它项目中使用,source组件建议勾选,在编码过程中比较有用)
完成安装后,启动QtCreater,在“工具”—“选项”—“Kits”中,Qt自动检测到MSVC编译器(没有黄色小图标说明安装正常)。
2新建一个工程,测试Qt安装是否成功(一般问题不大,创建一个窗口程序,能跑起来就行~~~~这里就不多说了)
注意选择MSVC编译模式。
双击安装程序,选择“Advanced Install”,“install form network”,后面的默认配置,下一步即可。在选择下载地址界面,第一个非常非常慢,可以在第二个和第四个之中选一个。
在“select package”界面,在搜索框中输入“qgis”(不用敲Enter键),筛选qgis相关包,我安装的是当前的长期有效版本(ltr),所以在带“ltr”的包中选择相同版本号的包下载即可。
下一步完成安装即可,至此,安装工作全部完成。
1.新建一个工程,选择Qt Widgets Application,在Kits步骤选择MSVC2017编译模式。
2.修改pro文件:
#需要添加xml模块
QT += core gui xml
#这两个语句指明了Qgis库头文件(.h)文件的路径。(这个地方网上资料有添加INCLUDE和LIB环境变量来实现的,但是我在“项目”-“构建环境”中对INCLUDE和LIB修改后,不起作用,原因未知,所以此处使用了绝对路径)*
INCLUDEPATH += C:\OSGeo4W64\apps\qgis-ltr\include
INCLUDEPATH += C:\OSGeo4W64\include
# 配置了Qgis库的lib文件的路径
LIBS += -LC:\OSGeo4W64\apps\qgis-ltr\lib -lqgis_core -lqgis_gui
#宏
unix{
DEFINES += CORE_EXPORT=
DEFINES += GUI_EXPORT=
}
!unix{
DEFINES += CORE_EXPORT=__declspec(dllimport)
DEFINES += GUI_EXPORT=__declspec(dllimport)
}
可以把OSGeo4W的安装目录配置到环境变量,添加的时候如下:
设置环境变量:OSGEO4W_HOME C:\OSGeo4W64
在pro文件中使用:
INCLUDEPATH += $( OSGEO4W_HOME)/ apps\qgis-ltr\include
…
3.修改main.cpp
修改后内容如下:
#include "mainwindow.h"
#include "qgsapplication.h"
#include
int main(int argc, char *argv[])
{
QgsApplication a(argc, argv,true);
QgsApplication::setPluginPath(QDir::currentPath() + "/plugins");
QgsApplication::initQgis(); //初始化QGIS应用
MainWindow w;
w.show();
return a.exec();
}
4.使用release模式编译
5.拷贝相关依赖到目录
(1)拷贝C:\OSGeo4W\apps\Qt5\bin 目录下全部dll到exe目录
(2) 拷贝C:\OSGeo4W\apps\Qt5\plugins 目录下的platforms目录到 exe目录下
(3)拷贝C:\OSGeo4W\apps\qgis-ltr\bin 目录下全部文件考到exe目录下。
(4)拷贝C:\OSGeo4W\bin 目录下全部dll文件和gdalplugins目录考到exe目录下
(5)把C:\OSGeo4W\apps\qgis-ltr下的plugins文件夹拷贝到exe目录下
(6)拷贝C:\OSGeo4W\share 中gdal目录到exe同级的share目录下(需要手动新建share文件夹)
6.重新编译运行,弹出窗口说明配置完成
1.环境变量PROJ_LIB
虽然在上一章节到步骤6后程序能跑起来,但是在加载图层时,如果不配置PROJ_LIB环境变量,就会出错(一堆pro.db的错误),所以这里就一起说一下。
使用OSGeo4W安装QGIS后,安装目录下有以下两个proj目录:
C:\OSGeo4W64\share\proj
C:\OSGeo4W64\apps\proj-dev\share\proj
网上有资料中使用第二个目录,但我在使用第二个目录时虽然没有了proj.db的错误,但是会出现”proj_create_from_database: SQLite error on SELECT name, type,…”的错误。使用第一个目录的时候则没有再报错,所以我把PROJ_LIB环境变量配置成了C:\OSGeo4W64\share\proj
环境变量的配置方法:
在“项目”–“构建环境”,点击“详情”,点击“添加”按钮,新增一条配置。
2.M_PI问题
如果出现M_PI未声明的标识符问题,则需要添加在pro文件中添加如下内容:
DEFINES += _USE_MATH_DEFINES
3.编码格式问题
虽然在编译时能通过,但是会报“warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失”的警告,解决方法如下:
QtCreater中点击“项目”—“Project Setting”—“编译器”,将编译器设置修改为“自定义设置”,在文件编码处,默认编码设为“UTF-8”,UTF-8 BOM处选择“如果编码是UTF-8则添加”,然后将出现警告的文件修改一下然后保存(敲个回车、打个空格都行,别出BUG就行),再重新编译即可(添加的qgis头文件仍然会报警告,目前没找到解决办法)。