基于 SuperMap iObjects C++ 10i(10.2.x)组件在 Visual Studio 2019 上的 Qt 项目开发环境配置
目录
前言
由于 SuperMap iObjects C++ 组件结构在版本 10.2.0
进行了更新,导致 CSDN 以前的教程无法完成开发环境的配置工作,若是使用 SuperMap iObjects C++ 10.2.0
之前 版本的组件进行开发,建议参考《SuperMap iObjects for C++ 入门详解(VS + Qt)》教程文档。
开发环境
Windows 11 - 64 位操作系统, 基于 x64 的处理器
开发工具
- SuperMap iObjects C++ 10i (10.2.x)(选择 组件》SuperMap iObjects C++ 10.2.0 / 10.2.1 版本)
- Qt 5.12.12(由于 Qt 官网 在国内打开速度太慢,建议去清华镜像源(下载需要的 Qt 安装包)
- qt-vsaddin-msvc2019-2.8.1-rev.06.vsix(Visual Studio 2019 Qt 插件)
- Visual Studio 2019(安装时务必勾选 C++ 开发环境)
一、安装 Qt 5.12.12
Qt 5.12.12
下载离线安装包后直接安装就好。安装完成后即可在系统中检索到 Qt Creator
(如下图)。
注意:
1. Qt 安装过程中选择组件时,务必勾选 MSVC 2017 64-bit
、MSVC 2017 32-bit
和 MSVC 2015 64-bit
组件(如果有可选的情况下),后续开发时根据 Visual Studio 2019 的开发环境选择对应的组件对 Qt 项目 进行编译。
2. Qt 安装时务必勾选 Qt Creator
编译程序,后续会使用 Qt Creator
对 SuperMap iObjects C++
组件中的 extensions4Qt
项目进行重新编译。
二、安装 Visual Studio 2019
Visual Studio 2019 安装时,务必勾选 使用 C++ 的桌面开发
组件包 (如下图所示) ,其余组件包根据各人需求自行选择安装。
Visual Studio 2019 安装完成后打开,新建项目》选择 C++
语言,支持新建如下图所示的 C++
项目即表示环境安装成功。
三、为 Visual Studio 2019 安装 Qt 扩展开发插件
退出 Visual Studio 2019 进程,双击 qt-vsaddin-msvc2019-2.8.1-rev.06.vsix
进行 Qt 插件
安装。安装完成后,打开 Visual Studio 2019 新建项目支持创建
四、调整 SuperMap iObjects C++ 组件包中依赖 Qt 的版本
由于 SuperMap iObjects C++
组件包中依赖的 Qt
是 5.6 版本的库,所以需要按顺序执行以下操作预处理 SuperMap iObjects C++
中的 Qt 依赖版本更新。(建议: 即使下载安装的 Qt
版本是 5.6,最好也进行以下操作进行版本更新,无法确保下载的 Qt 子版本是一致的)
-
将本机
Qt
安装目录(如:C:\Qt\Qt5.12.12\5.12.12\msvc2017_64\bin)下的Qt5Cored.dll
、Qt5Guid.dll
和Qt5Widgetsd.dll
动态链接库文件 拷贝替换SuperMap iObjects C++
组件包安装目录(如:C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\bin\bind_x64)中自带的Qt5Cored.dll
、Qt5Guid.dll
和Qt5Widgetsd.dll
动态链接库文件; -
将本机
Qt
平台插件安装目录(如:C:\Qt\Qt5.12.12\5.12.12\msvc2017_64\plugins\platforms)下的全部动态链接库文件 拷贝替换SuperMap iObjects C++
组件包平台插件安装目录(如:C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\bin\bind_x64\plugins\platforms)中的全部动态链接库文件; -
使用
Qt Creator
打开SuperMap iObjects C++
组件包安装目录中的 Extensions4Qt 项目(项目目录如:C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\sample\extensions4Qt),打开后如图所示:
-
在
Qt Creator
中配置 Extensions4Qt 项目编译时需要的 环境变量,将SuperMap iObjects C++
安装目录调试环境路径配置给 Extensions4Qt 项目,如下图所示:
-
在
Qt Creator
中编译生成与本机Qt
版本适配的 Extensions4Qt 动态链接库,将新生成的Extensions4Qt.dll
、Extensions4Qt.lib
、Extensions4Qt.exp
、Extensions4Qt.ilk
和Extensions4Qt.pdb
文件 拷贝替换SuperMap iObjects C++
安装目录(如:C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\bin\bind_x64)中的对应文件。
五、通过 Visual Studio 2019 新建 Qt 项目并配置开发环境
由于准备开发环境时已经为 Visual Studio 2019
安装了 Qt
插件,现在直接按以下步骤通过 Visual Studio 2019
新建 Qt
项目并配置开发环境即可:
-
新建 Qt Widgets Application 桌面应用项目;
-
鼠标右键打开新建
Qt
桌面应用项目 属性 面板,选择 C/C++ 环境配置,进行 附加包含目录 配置,如下图所示:
配置以下路径(具体路径根据本机安装路径进行调整)C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\include C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\include\private C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\sample\extensions4Qt
-
配置 C/C++预处理器 环境
在 预处理器定义 中添加 _UGUNICODE 标记,如下图所示: -
鼠标右键打开新建
Qt
桌面应用项目 属性 面板,选择 链接器 环境配置,进行 附加库目录 配置,如下图所示:
配置以下路径(具体路径根据本机安装路径进行调整)C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\lib\libd_x64 C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\sample\debug\x64
- 配置 链接器》输入》附加依赖项
在 链接器》输入》附加依赖项 中输入以下内容进行配置Extensions4Qt.lib SuSRDBCId.lib SuStreamd.lib SuSymbold.lib SuSymbolExchanged.lib SuSymbolMarker3Dd.lib SuTheme3DBased.lib SuTileStoraged.lib SuToolkit3Dd.lib SuToolkitd.lib SuToolkitPointCloudd.lib SuTopoBased.lib SuTopoBuilderd.lib SuVRDevicesd.lib SuWorkspaced.lib SuWrapc.lib SuAlgorithm3Dd.lib SuAlgorithmd.lib SuAllocationd.lib SuAnalyst3Dd.lib SuAnimationd.lib SuBase3Dd.lib SuBased.lib SuBGDataCompilerd.lib SuBPlusTreed.lib SuCacheBuilder3Dd.lib SuCacheBuilderd.lib SuCacheFiled.lib SuChartBased.lib SuChartToolkitd.lib SuCompactFiled.lib SuCVToolkitd.lib SuDataCheckd.lib SuDataExchanged.lib SuDB2CId.lib SuDCPackagerd.lib SuDCToolkitsd.lib SuDrawing3Dd.lib SuDrawingd.lib SuDrawingLayoutd.lib SuDRDSCId.lib SuElementd.lib SuEngineBaiduMapsd.lib SuEngineBingMapsd.lib SuEngined.lib SuEngineDB2d.lib SuEngineDRDSd.lib SuEngineESd.lib SuEngineExtendFiled.lib SuEngineGanosd.lib SuEngineGaoDeMapsd.lib SuEngineGoogleMapsd.lib SuEngineGPd.lib SuEngineImagePlugind.lib SuEngineMySQLd.lib SuEngineODBCd.lib SuEngineOGCd.lib SuEngineOGDCd.lib SuEngineOpenStreetMapsd.lib SuEngineOracled.lib SuEnginePGd.lib SuEnginePGisd.lib SuEngineRestd.lib SuEngineSCVd.lib SuEngineSDEd.lib SuEngineSMCloudd.lib SuEngineSQLPLUSd.lib SuEngineSRDBd.lib SuEngineSspd.lib SuEngineUDBd.lib SuEngineXYZTiled.lib SuFileParser3DModeld.lib SuFileParser3dsd.lib SuFileParserAcadd.lib SuFileParserBitMapd.lib SuFileParserCSVd.lib SuFileParserd.lib SuFileParserDEMd.lib SuFileParserDGNd.lib SuFileParserE00d.lib SuFileParserENCd.lib SuFileParserFMEd.lib SuFileParserGDALd.lib SuFileParserGEOJSONd.lib SuFileParserGJBd.lib SuFileParserGLTFd.lib SuFileParserKMLd.lib SuFileParserLidard.lib SuFileParserMAPGISd.lib SuFileParserMitabd.lib SuFileParserNetCDFd.lib SuFileParserOGRd.lib SuFileParserOrangeTabd.lib SuFileParserOSMd.lib SuFileParserPGDBVd.lib SuFileParserPointCloudd.lib SuFileParserRAWd.lib SuFileParserS3MBd.lib SuFileParserSCVd.lib SuFileParserSGMd.lib SuFileParserSimpleJsond.lib SuFileParserTEMSd.lib SuFileParserVCTd.lib SuFMELicensed.lib SuGeneralizationd.lib SuGeoCoded.lib SuGeometricNetworkd.lib SuGeometry3Dd.lib SuGeometryCADd.lib SuGeometryConverterd.lib SuGeometryd.lib SuGeometryLayoutd.lib SuGeometryPlotd.lib SuGeoOperation3Dd.lib SuGeoOperationd.lib SuGraphics3Dd.lib SuGraphics3DGameEngined.lib SuGraphics3DOGREd.lib SuGraphicsd.lib SuGraphicsPDFd.lib SuGraphicsPSd.lib SuGraphicsWd.lib SuGridAnalystd.lib SuGridAnalystOpenCLd.lib SuGridModelingd.lib SuKDBCId.lib SuLayer3DDatasetd.lib SuLayer3DFiled.lib SuLayer3DMapd.lib SuLayer3DTreed.lib SuLayoutEditord.lib SuLinearReferenced.lib SuLogisticsd.lib SuMapd.lib SuMapEditord.lib SuMapMatchingd.lib SuMapServiceStubd.lib SuMGAnimationExpd.lib SuMGAuxiliaryPlottingd.lib SuMGCommond.lib SuMGMapDatad.lib SuMGMovingTargetd.lib SuMGObjectsd.lib SuMGSituationd.lib SuMGSituationMonitord.lib SuMGSituationPlottingd.lib SuMGSituationSimulationd.lib SuMongoCId.lib SuMosaicd.lib SuMosaicGDALd.lib SuMosaicOpenCVd.lib SuMySQLCId.lib SuNetToolkitd.lib SuNetworkBuilderd.lib SuNetworkEnvironmentd.lib SuNTopoDataCompilerd.lib SuNTopoIndexTreed.lib SuODBCCId.lib SuOGCParserd.lib SuOGDCd.lib SuOracleCId.lib SuOverlayd.lib SuParticleSystemd.lib SuPathAnalystCHd.lib SuPathAnalystd.lib SuPathNavid.lib SuPluginArcgisMapCached.lib SuPluginCommond.lib SuPluginGECached.lib SuPluginGlobalCached.lib SuPluginGridCached.lib SuPluginMapCache50d.lib SuPluginMapCached.lib SuPluginWebCached.lib SuPostgreSQLCId.lib SuProjectiond.lib SuProjectionProjd.lib SuProjectionWKTd.lib SuProximityd.lib SuPublicTransportd.lib SuRectifyd.lib SuRenderd.lib SuRepresentationd.lib SuRStarTreed.lib SuScened.lib SuSceneEditord.lib SuSDECId.lib SuSpatialIndexd.lib SuSpatialQueryd.lib SuSQLiteCId.lib
- 鼠标右键打开新建
Qt
桌面应用项目 属性 面板,选择 生成事件》生成后事件 ,进行 命令行 配置,如下图所示:
在 命令行 中输入以下内容(具体路径根据本机安装路径进行调整)if not exist "$(SolutionDir)$(PlatformName)\$(Configuration)\VERSION" (xcopy /r /y C:\SuperMap\supermap-iobjectscpp-10.2.1-20428-92245-win-all\bin\bind_x64\ $(SolutionDir)$(PlatformName)\$(Configuration)\ /s)
<font color=red> **注意:** *此处也可以不配置 **生成事件**;若不配置生成事件将程序运行环境复制到输出目录的话,则需要修改项目编译输出目录为 `SuperMap iObjects C++` 运行环境安装目录(此操作存在潜在损坏运行环境的潜在风险,建议配置 **生成事件**)!!!* </font>
至此已完成 SuperMap iObject C++ 10i (10.2.0及以上版本)
在 Visual Studio 2019
+ Qt
桌面应用项目的所有开发环境参数配置,下面可以开始项目编码。
六、编码
-
C++ 头文件编码 (CSuperMapiDesktopForCPP.h)
#pragma once #include <QtWidgets/QMainWindow> #include "ui_CSuperMapiDesktopForCPP.h" #include "Workspace/UGWorkspace.h" #include "Map/UGMap.h" #include "qmapcontrol.h" #include "translator.h" using namespace UGC; using namespace std; class CSuperMapiDesktopForCPP : public QMainWindow { Q_OBJECT public: CSuperMapiDesktopForCPP(QWidget *parent = Q_NULLPTR); private: Ui::CSuperMapiDesktopForCPPClass ui; UGWorkspace* workspace; };
-
C++ 源文件编码 (CSuperMapiDesktopForCPP.cpp)
#include "CSuperMapiDesktopForCPP.h" #include "stdafx.h" CSuperMapiDesktopForCPP::CSuperMapiDesktopForCPP(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); workspace = new UGWorkspace(); QString workpsaceFilePath = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("打开工作空间"), QString::fromLocal8Bit(""), QString::fromLocal8Bit("工作空间文件 (*.smwu *.sxwu)")); if (workpsaceFilePath != NULL && QFileInfo::exists(workpsaceFilePath)) { if (workspace->Open(Translator::QStr2UGStr(workpsaceFilePath))) { UGString mapName = workspace->m_MapStorages.GetNameAt(0); ui.centralWidget->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); QHBoxLayout* layout = new QHBoxLayout(ui.centralWidget); QMapControl* mapControl = new QMapControl(workspace); layout->addWidget(mapControl); UGMap* map = mapControl->GetMap(); map->Open(mapName); mapControl->Refresh(); } } }
七、运行结果
总结
由于配置 SuperMap iObjects C++
在 Visual Studio 2019
和 Qt
开发环境较复杂,以下对重要步骤以及开发环境配置流程中可能存在的坑进行复盘,以免重复踩坑。
-
SuperMap iObjects C++ 10i (10.2.0及以上版本)
进行了结构上的更新,与Qt
绑定更加紧密,SDK依赖了Qt
平台插件,所以在根据本机安装的Qt
版本对SuperMap iObjects C++
运行环境库进行更新的时候,一定要更新 plugins\platforms 中的Qt
平台插件。 -
若要使用
SuperMap iObjects C++
组件中自带的 QMapControl 控件用于显示地图,务必要根据本机安装的Qt
版本对 Extensions4Qt 项目进行重新编译,避免因Qt
版本不兼容造成的编译异常。 -
目前
SuperMap iObjects C++
仅适配Qt 5.6
及以上版本,暂未适配Qt 6.x
系列产品,不建议使用Qt 6.x
版本进行开发。 -
建议在
Visual Studio 2019
创建的Qt
项目中配置 生成事件 命令!若不配置,则需要修改项目编译输出路径到SuperMap iObjects C++
安装包中的开发环境目录内才可正常运行 (此操作存在潜在损坏运行环境的潜在风险,不建议修改项目编译输出路径)。