Здравствуйте!
Символ _Z9strmyncpyPcPKc реализован в библиотеке mapacces. Поэтому, если мы производим предварительную подгрузку этой библиотеки с помощью LD_PRELOAD, линковщик находит данный символ (в выводе команды ldd отсутствует строка undefined symbol с данным символом).
Поскольку при работе программы возникает сообщение об отсутствии этого символа, вероятно некорректно линкуется библиотека mapacces (хотя присланный Вами фрагмент памяти программы говорит о том, что она подгружена).
Для того, чтобы воспроизвести одинаковое поведение, мы немного модифицировали предыдущий фрагмент кода.
Теперь он выводит образцы всех объектов из классификатора для карт Ногинска и Shape из состава ГИС Оператор SE (классификаторы обеих карт ссылаются на библиотеку shape.iml64):
Библиотека libqdmapacces.so из состава ГИС Конструктор при этом линкуется статически:
Мы протестировали корректное выполнение этого кода для отрисовки значков объектов данных карт на сертифицированной версии ГИС Конструктор.
Пожалуйста, попробуйте запустить данное приложение. Спасибо!
Символ _Z9strmyncpyPcPKc реализован в библиотеке mapacces. Поэтому, если мы производим предварительную подгрузку этой библиотеки с помощью LD_PRELOAD, линковщик находит данный символ (в выводе команды ldd отсутствует строка undefined symbol с данным символом).
Поскольку при работе программы возникает сообщение об отсутствии этого символа, вероятно некорректно линкуется библиотека mapacces (хотя присланный Вами фрагмент памяти программы говорит о том, что она подгружена).
Для того, чтобы воспроизвести одинаковое поведение, мы немного модифицировали предыдущий фрагмент кода.
Теперь он выводит образцы всех объектов из классификатора для карт Ногинска и Shape из состава ГИС Оператор SE (классификаторы обеих карт ссылаются на библиотеку shape.iml64):
Код |
---|
#include <assert.h> #include <iostream> #include <QImage> #include "mapapi.h" void PaintObject(HMAP mapHandle, HRSC rscHandle, HOBJ objectHandle, int rscObjectNumber) { // Получить номер функции отображения и параметры из классификатора long rscObjectFunctionNumber = mapGetRscObjectFunction(rscHandle, rscObjectNumber); assert(rscObjectFunctionNumber); std::cout << "rsc object function number: " << rscObjectFunctionNumber << std::endl; char* rscObjectParameters = (char*)mapGetRscObjectParameters(rscHandle, rscObjectNumber); assert(rscObjectParameters); // Запросить параметры палитры карты (для отображения объекта) COLORREF palette[256]; long colorCount = mapGetSiteColorsCount(mapHandle, mapHandle); mapGetSitePalette(mapHandle, mapHandle, palette, colorCount); // Выделить память для отрисовки объекта const int ICON_SIZE = 32; XIMAGEDESC ximageDesc; ximageDesc.Width = ICON_SIZE; ximageDesc.Height = ICON_SIZE; ximageDesc.Depth = 32; ximageDesc.CellSize = ximageDesc.Depth / 8; ximageDesc.RowSize = ximageDesc.Width * ximageDesc.CellSize; char *paintMemory = new char[ximageDesc.Width * ximageDesc.Height * ximageDesc.CellSize]; ximageDesc.Point = paintMemory; assert(paintMemory); // Отрисовать образец объекта RECT rectDraw; rectDraw.left = 0; rectDraw.top = 0; rectDraw.right = ICON_SIZE; rectDraw.bottom = ICON_SIZE; char *objectText = NULL; long objectLocal = mapObjectLocal(objectHandle); long isPainted = mapPaintExampleObjectByFuncToXImage(mapHandle, &ximageDesc, &rectDraw, rscObjectFunctionNumber, rscObjectParameters, colorCount, palette, objectText, objectLocal); assert(isPainted); // Вывести картинку в файл QImage image((uchar*)(ximageDesc.Point), ximageDesc.Width, ximageDesc.Height, QImage::Format_RGB32); image.save("/tmp/out.png"); } int main() { // Открыть карту HMAP mapHandle = mapOpenData("/usr/Operator11/Data/Shape/shape.sitx"); // HMAP mapHandle = mapOpenData("/usr/Operator11/Data/Noginsk/Noginsk.sit"); assert(mapHandle); // Получить классификатор HRSC rscHandle = mapGetRscIdent(mapHandle, mapHandle); assert(rscHandle); // Создать объект в памяти HOBJ objectHandle = mapCreateObject(mapHandle); assert(objectHandle); // Отрисовать объекты из классификатора for (int rscObjectNumber = 1; rscObjectNumber <= mapGetRscObjectCount(rscHandle); rscObjectNumber++) { std::cout << "current object number: " << rscObjectNumber << std::endl; PaintObject(mapHandle, rscHandle, objectHandle, rscObjectNumber); } mapFreeObject(objectHandle); mapCloseData(mapHandle); mapCloseMapAccess(); return 0; } |
Код |
---|
INCLUDEPATH += /usr/share/qt4/include LIBS += -lqdmapacces SOURCES += \ main.cpp |
Пожалуйста, попробуйте запустить данное приложение. Спасибо!