Здравствуйте!
Символ _Z9strmyncpyPcPKc реализован в библиотеке mapacces. Поэтому, если мы производим предварительную подгрузку этой библиотеки с помощью LD_PRELOAD, линковщик находит данный символ (в выводе команды ldd отсутствует строка undefined symbol с данным символом).
Поскольку при работе программы возникает сообщение об отсутствии этого символа, вероятно некорректно линкуется библиотека mapacces (хотя присланный Вами фрагмент памяти программы говорит о том, что она подгружена).
Для того, чтобы воспроизвести одинаковое поведение, мы немного модифицировали предыдущий фрагмент кода.
Теперь он выводит образцы всех объектов из классификатора для карт Ногинска и Shape из состава ГИС Оператор SE (классификаторы обеих карт ссылаются на библиотеку shape.iml64):
[CODE]#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;
}[/CODE]Библиотека libqdmapacces.so из состава ГИС Конструктор при этом линкуется статически:
[CODE]INCLUDEPATH += /usr/share/qt4/include
LIBS += -lqdmapacces
SOURCES += \
main.cpp[/CODE]Мы протестировали корректное выполнение этого кода для отрисовки значков объектов данных карт на сертифицированной версии ГИС Конструктор.
Пожалуйста, попробуйте запустить данное приложение. Спасибо!