VS2019+QGIS+cmake二次开发环境搭建
总共分为以下步骤:
-
下载qgis和二次开发库
-
VS2019搭建开发环境
- 配置VS2019中的cmake - 配置环境变量
-
编写测试代码
-
运行测试代码
- 拷贝运行程序需要用的动态库文件
参考文档:
QGis 二次开发搭建(windows)
QGis QgsVectorLayer 图层加载(shp file矢量图层)
1. 开发环境
- Win10 ×64
- VS2019
- OSGeo4W
2. 下载qgis二次开发SDK
打开osgeo4w-setup-x86_64.exe后
1.选择advanced installenter image description here
2.选择install from Internetenter image description here
3.选择自己的安装路径
4.选择一个下载网站enter image description here
5.选择需要的开发库
enter image description here
首先在上面的搜索栏输入qgis-ltr(qgis长期支持版),搜索结果出来后点击ALL旁边的Default,变成Install。
enter image description here
enter image description here
完成这一步后清除搜索框的内容,再搜索qgis-dev-deps,重复刚才的步骤,将All点击成Install状态。
enter image description here
然后可以一路点击下一步直到安装完成。
3. VS2019搭建开发环境
安装自带cmake插件
创建bat文件设置临时环境变量拉起VS,注意set PATH后的路径应写在同一行。
@echo off
::把开发环境设置到当前cmd的环境(仅对cmd生效)
set PATH=%PATH%;D:\OSGeo4W64\bin;D:\OSGeo4W64\apps\qgis-ltr\bin;D:\OSGeo4W64\apps\qgis-ltr-dev\bin;D:\OSGeo4W64\apps\Qt5\bin;D:\OSGeo4W64\apps\grass\grass78\bin;D:\OSGeo4W64\apps\gdal-dev\bin;D:\OSGeo4W64\apps\proj-dev\bin;D:\OSGeo4W64\apps\Qt5\plugins\platforms;D:\OSGeo4W64\apps\Qt5\plugins;
::设置坐标系相关文件
set GDAL_DATA=D:\OSGeo4W64\share\gdal
echo "set env path end:"
echo ******************************************************************************************
echo %PATH%
echo ******************************************************************************************
echo "Start visoual studio 2019"
::设置vs启动(路径为:右键打开所在的文件夹直到找到exe执行程序)
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe"
::pause>nul
4. 编写测试代码
文件结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9EVEPdP3-1648548446609)(https://i.loli.net/2021/06/17/7OtVUCzkmJ6QPTA.png)]enter image description here
顶层CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
add_subdirectory(RADAR_TRAIN_REALTIME_APP)
#add_subdirectory(RADAR_TRAIN_HISTORY_APP)
radar_train_realtime.cpp
#include <qgis.h>
#include "radar_train_realtime.h"
#include <QApplication>
#include <qgis_core.h>
#include <qgis_gui.h>
#include <qgsdatasourceuri.h>
#include <qgsproviderregistry.h>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <qgssinglesymbolrenderer.h>
#include <qgsapplication.h>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <qgsproject.h>
#include <QFileDialog>
#include <qgsmapcanvas.h>
#include "qgssymbol.h"
#include "qgsrenderer.h"
#include <qgsapplication.h>
#include <qgsproviderregistry.h>
#include <qgsvectorlayer.h>
#include <qgsrasterlayer.h>
#include <qgsmapcanvas.h>
#include <qgssinglesymbolrenderer.h>
#include <QMessageBox>
#include< qgsmaplayerstore.h >
#include <qgsrasterlayer.h>
#include< qgsmaplayerstore.h >
#include <QDebug>
#include <qgsmapcanvas.h>
#include <qgsmapsettings.h>
#include <QgsRasterIdentifyResult.h>
RadarTrainRealtime::RadarTrainRealtime() {}
RadarTrainRealtime::~RadarTrainRealtime() {}
int main(int argc, char* argv[])
{
QgsApplication myApp(argc, argv, true);
myApp.setPrefixPath("D:\\OSGeo4W64\\apps\\qgis", true); //配置prefix路径
QgsProviderRegistry::instance("D:\\OSGeo4W64\\apps\\qgis\\plugins"); //驱动管理
QString file("D:\\BOOKS\\shp\\City.shp");
QList<QgsMapLayer*> listVecLayer;
QgsVectorLayer Vectorlayer; //矢量图层
Vectorlayer.setProviderEncoding("UTF-8"); //字符集
Vectorlayer.setMinimumScale(1.0); //设置坐标轴的最小刻度值
QString layer_name = QFileInfo(file).completeBaseName();
Vectorlayer.setDataSource(file, layer_name, "ogr", true);
listVecLayer.append(&Vectorlayer);
qDebug() << Vectorlayer.featureCount();
QgsProject::instance()->addMapLayers(listVecLayer);
QgsMapCanvas QGSMC;
QGSMC.setLayers(listVecLayer);
QGSMC.setExtent(Vectorlayer.extent());
QGSMC.enableAntiAliasing(true); //抗锯齿处理
QGSMC.freeze(false);
QGSMC.setDragMode(QGraphicsView::RubberBandDrag); //拖拽模式
QGSMC.setVisible(true);
QGSMC.zoomToFullExtent();
QGSMC.refresh();
QGSMC.show();
return myApp.exec();
}
第二层CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
project ("RTRAPP")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
SET(QT_USE_QTMAIN TRUE)
find_package(Qt5 COMPONENTS Core Widgets Xml Sql REQUIRED)
#set(qgis_path "NOT-FOUND" CACHE PATH D:/OSGeo4W64)
set(qgis_path D:/OSGeo4W64/apps/qgis-ltr)
set(osg_path D:/OSGeo4W64)
if(qgis_path STREQUAL "NOT-FOUND")
message(FATAL_ERROR "need download qgis sdk from Run Geo4w.exe")
endif()
message(STATUS "qgis_path >>${qgis_path}")
set(CMAKE_BUILD_RPATH D:/OSGeo4W64) #设定cmake_build_path的目录
message(STATUS "CMAKE_BUILD_RPATH >>${CMAKE_BUILD_RPATH}") #打印目录
set(OSG_INC "${osg_path}/include")
set(OSG_LIB "${osg_path}/lib")
set(OSG_BIN "${osg_path}/bin")
set(QGIS_INC "${qgis_path}/include")
set(QGIS_LIB "${qgis_path}/lib")
set(QGIS_BIN "${qgis_path}/bin")
message(STATUS "OSG_INC >> ${OSG_INC}")
message(STATUS "OSG_LIB >> ${OSG_LIB}")
message(STATUS "QGIS_INC >> ${QGIS_INC}")
message(STATUS "QGIS_LIB >> ${QGIS_LIB}")
file(GLOB ALL_LIBS ${QGIS_LIB}/*.lib)
message(STATUS "ALL_LIBS >>${ALL_LIBS}")
file(GLOB ALL_LIBS2 ${OSG_LIB}/*.lib)
message(STATUS "ALL_LIBS2 >>${ALL_LIBS2}")
include_directories(${QGIS_INC} D:/OSGeo4W64/apps/Qt5/include) #头文件的路径 SDK下QGIS目录和自带Qt5的头文件路径
link_directories(${GIS_LIB})
link_libraries(${ALL_LIBS})
link_libraries(${ALL_LIBS2})
add_definitions(-D_USE_MATH_DEFINES)
aux_source_directory(${CMAKE_SOURCE_DIR} SRC_ALL)
#add_subdirectory(view)
#add_executable(${PROJECT_NAME} WIN32 ${SRC_ALL}) #no console
#add_executable(${PROJECT_NAME} ${SRC_ALL} ${ALL_UI} "radar_train_realtime.h" ) # console
add_executable(${PROJECT_NAME} radar_train_realtime.cpp ${ALL_UI} ) # console
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Xml Qt5::Sql)
file(WRITE ${RTRAPP_SOURCE_DIR}/bin/pathCmd.cmd
"@echo off
set PATH=%PATH%;${QGIS_BIN};D:/OSGeo4W64/apps/Qt5/bin;${OSG_BIN};
${PROJECT_NAME}.exe
echo application begin...
::pause>nul"
)#这里生成一个cmd脚本用于拉起exe。在VS开发下可能不太方便调试。
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${RTRAPP_SOURCE_DIR}/bin
ARCHIVE DESTINATION ${RTRAPP_SOURCE_DIR}/lib
LIBRARY DESTINATION ${RTRAPP_SOURCE_DIR}/lib)
install(DIRECTORY ${CMAKE_BUILD_RPATH} DESTINATION ${RTRAPP_SOURCE_DIR}/bin FILES_MATCHING PATTERN "*.cmd")
使用release版本执行编译,即可生成”RTRAPP.exe”和pathCmd.cmd。
5. 运行测试代码
如果此时双击运行可执行文件,会报缺少很多dll文件的错误,因为需要将Qt5依赖的文件拷贝到项目文件目录下。将
D:\OSGeo4W\apps\qgis\bin
D:\OSGeo4W\bin
D:\OSGeo4W\apps\Qt5\bin
目录下dll文件拷贝到工程Release目录下
还是有可能会缺dll文件,就需要用到Qt5自带的“windeployqt.exe”程序,可以用如下方法添加:
- 把“D:\OSGeo4W64\apps\Qt5\bin”添加到系统的环境变量的path中。
- 打开VS 2019开发人员cmd窗口,输入命令windeployqt [exe文件的路径],比如我的是“windeployqt D:\BOOKS\VSProject\RADAR_TRAIN\RADAR_TRAIN_REALTIME_APP\bin\RTRAPP.exe”,按下回车就完成了资源拷贝。如图所示:
完成拷贝后再运行测试程序就能正常运行。