QGIS с автономным приложением C ++ в Qt Creator

Мои проекты состоят из нескольких подпроектов, один из которых включает библиотеки QGIS.

.Про файл:

TEMPLATE = subdirs

CONFIG += ordered

SUBDIRS += \
Utils \
Maps \
GoogleMapsInterface \
Positioning \
NetworkObjects \
DataBaseManager \
SensorNetworkUI \

Это .pro-файл Карт, который включает библиотеки QGIS:

CONFIG += c++11
CONFIG += staticlib
TEMPLATE = lib
QT += core gui
QT += widgets
QT += xml

TARGET = maps

DEFINES += MAPS_INTERFACE

INCLUDEPATH += "C:/OSGeo4W/apps/qgis/include/"INCLUDEPATH += "C:/OSGeo4W/include/"
win32:CONFIG(Release, Debug|Release) {
LIBS += -LC:/OSGeo4W/lib/ -lQtCore4
LIBS += -LC:/OSGeo4W/lib/ -lQtGui4
LIBS += -LC:/OSGeo4W/lib/ -lQtXml4
}

else:win32:CONFIG(Debug, Debug|Release) {
PRE_TARGETDEPS += C:/OSGeo4W/lib/QtCored4.lib
PRE_TARGETDEPS += C:/OSGeo4W/lib/QtGuid4.lib
PRE_TARGETDEPS += C:/OSGeo4W/lib/QtXmld4.lib
LIBS += -LC:/OSGeo4W/lib/ -lQtCored4
LIBS += -LC:/OSGeo4W/lib/ -lQtGuid4
LIBS += -LC:/OSGeo4W/lib/ -lQtXmld4
}

LIBS += -LC:/OSGeo4W/lib -lgdal_i -lgeos_c
LIBS += -LC:/OSGeo4W/apps/qgis-dev/lib -lqgis_core -lqgis_gui

DEFINES += CORE_EXPORT=__declspec(dllexport)
DEFINES += GUI_EXPORT=__declspec(dllexport)

Это .pro-файл для SensorNetworkUI:

CONFIG += console
TARGET = SensorNetwork
TEMPLATE = app

greaterThan(QT_MAJOR_VERSION, 4):
QT += widgets
QT += core gui
QT += opengl
QT += sql
QT += xml
QT += multimedia

INCLUDEPATH += ../
INCLUDEPATH += "C:/OSGeo4W/apps/qgis/include/"INCLUDEPATH += "C:/OSGeo4W/include/"
win32:CONFIG(Release, Debug|Release) {
LIBS += -LC:/OSGeo4W/lib/ -lQtCore4
LIBS += -LC:/OSGeo4W/lib/ -lQtGui4
LIBS += -LC:/OSGeo4W/lib/ -lQtXml4
}

else:win32:CONFIG(Debug, Debug|Release) {
PRE_TARGETDEPS += C:/OSGeo4W/lib/QtCored4.lib
PRE_TARGETDEPS += C:/OSGeo4W/lib/QtGuid4.lib
PRE_TARGETDEPS += C:/OSGeo4W/lib/QtXmld4.lib
LIBS += -LC:/OSGeo4W/lib/ -lQtCored4
LIBS += -LC:/OSGeo4W/lib/ -lQtGuid4
LIBS += -LC:/OSGeo4W/lib/ -lQtXmld4
}

DEFINES += CORE_EXPORT=__declspec(dllexport)
DEFINES += GUI_EXPORT=__declspec(dllexport)

LIBS += -LC:/OSGeo4W/lib -lgdal_i -lgeos_c
LIBS += -LC:/OSGeo4W/apps/qgis-dev/lib -lqgis_core -lqgis_gui
LIBS += -L../ -ldbmanager -lsnobjects -lpositioning -lsnutils -lmaps

Однако я получаю ошибки, подобные этим:

maps.lib(moc_ClickTool.obj) : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsFeature const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsFeature@@PAV2@@Z)
MainWindow.obj : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsFeature const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsFeature@@PAV2@@Z)

Я также заметил, что предложения автозаполнения, представленные Qt Creator, не включают файлы заголовков QGIS. Значит ли это, что Qt Creator не может их найти? Он не выдает ошибок после того, как все имя было напечатано. Я даже могу открыть указанные файлы заголовков в Qt Creator.

Может кто-нибудь сказать, пожалуйста, где я иду не так?

РЕДАКТИРОВАТЬ:
Вот где начинается ошибка:

Creating library ..\SensorNetwork.lib and object ..\SensorNetwork.exp
maps.lib(moc_ClickTool.obj) : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsFeature const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsFeature@@PAV2@@Z)
MainWindow.obj : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsFeature const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsFeature@@PAV2@@Z)
maps.lib(MapCanvas.obj) : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsFeature const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsFeature@@PAV2@@Z)
maps.lib(ClickTool.obj) : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsFeature const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsFeature@@PAV2@@Z)
maps.lib(moc_MapCanvas.obj) : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsFeature const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsFeature@@PAV2@@Z)
maps.lib(moc_ClickTool.obj) : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsExpressionContext const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsExpressionContext@@PAV2@@Z)
MainWindow.obj : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsExpressionContext const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsExpressionContext@@PAV2@@Z)
maps.lib(MapCanvas.obj) : error LNK2001: unresolved external symbol "public: virtual class QVariant __thiscall QgsExpression::Function::func(class QList<class QVariant> const &,class QgsExpressionContext const *,class QgsExpression *)" (?func@Function@QgsExpression@@UAE?AVQVariant@@ABV?$QList@VQVariant@@@@PBVQgsExpressionContext@@PAV2@@Z)
...
...
maps.lib(MapCanvas.obj) : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QgsRasterDataProvider::staticMetaObject" (?staticMetaObject@QgsRasterDataProvider@@2UQMetaObject@@B)
maps.lib(MapCanvas.obj) : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QgsRasterLayer::staticMetaObject" (?staticMetaObject@QgsRasterLayer@@2UQMetaObject@@B)
maps.lib(ClickTool.obj) : error LNK2001: unresolved external symbol "public: virtual void __thiscall QgsMapTool::renderComplete(void)" (?renderComplete@QgsMapTool@@UAEXXZ)
maps.lib(ClickTool.obj) : error LNK2001: unresolved external symbol "public: virtual bool __thiscall QgsMapTool::isTransient(void)const " (?isTransient@QgsMapTool@@UBE_NXZ)
maps.lib(ClickTool.obj) : error LNK2001: unresolved external symbol "public: virtual bool __thiscall QgsMapTool::isEditTool(void)const " (?isEditTool@QgsMapTool@@UBE_NXZ)
..\SensorNetwork.exe : fatal error LNK1120: 93 unresolved externals
jom: D:\Atmika\Sensor_Network\build\win32\Debug\SensorNetworkUI\Makefile.Debug [..\SensorNetwork.exe] Error 1120
jom: D:\Atmika\Sensor_Network\build\win32\Debug\SensorNetworkUI\Makefile [debug] Error 2
14:21:50: The process "D:\Qt\Qt5.7.1\Tools\QtCreator\bin\jom.exe" exited with code 2.
Error while building/deploying project Sensor_Network (kit: Desktop Qt 5.7.1 MSVC2015 32bit)
When executing step "Make"

0

Решение

Ваша ошибка определенно указывает на то, что компоновщик не нашел правильный символ в библиотеке, как указано «error LNK», поэтому заголовки были правильно найдены ранее.

  1. Основная библиотека QGIS не найдена
  2. Основная библиотека не связана из-за отсутствующей зависимости LIBS += ... в одном из ваших проектов
  3. Библиотеки были скомпилированы с другим компилятором, чем у вас, создавая ABI, который не понимает ваш компилятор
  4. Ваши заголовки и фактическая библиотека отличаются (например, если они указывают на другую версию QGIS).

Вы, вероятно, должны проверить, что файлы библиотеки, на которые вы указываете, присутствуют и соответствуют правильной версии QGIS.
При динамическом соединении также убедитесь, что все проекты в зависимости от этого на самом деле включают директиву компоновщика LIBS += ...,


РЕДАКТИРОВАТЬ: ОП нашел проблему просто dllexport, который должен быть DllImport вместо этого для переменных QGIS CORE_EXPORT и GUI_EXPORT:

DEFINES += CORE_EXPORT=__declspec(dllimport)
DEFINES += GUI_EXPORT=__declspec(dllimport)

Хорошо документированный сайт в качестве ссылки для QGIS:
https://3nids.wordpress.com/

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]