[gdal-dev] Registering C++ Pixel Functions for Command-Line Utilities
Conor McIndoe
conormcindoe1 at gmail.com
Tue Jan 12 03:55:43 PST 2021
Hello developers,
I am just learning the ropes with GDAL so apologies if some of this is
quite far off. Also apologies in advance for the essay :)
I am trying to register a pixel function, written in C++, in order to
produce a VRT and eventually a TIF from some input TIFs. I am trying to
follow an thread from this mailing list
(https://lists.osgeo.org/pipermail/gdal-dev/2011-May/028742.html) to
make GDAL aware of a shared library which contains and registers the
pixel function. Hopefully there is some clear error here which one of
you can spot?
I have adapted the example found at the VRT reference page
(https://gdal.org/drivers/raster/vrt.html) to produce a function which
sets every pixel equal to 1 (just to test the workflow):
// src/gdalPixelFunctions.cpp
#include "gdal.h"
#include "cpl_conv.h"
#include "gdal_priv.h"
#include <iostream>
CPLErr OneFunction(
void **papoSources, int nSources, void *pData,
int nXSize, int nYSize, GDALDataType eSrcType,
GDALDataType eBufType, int nPixelSpace, int nLineSpace
)
{
int ii, iLine, iCol;
double pix_val;
double x0, x3, x4, x8;
if(nSources != 4) return CE_Failure;
for(iLine = 0; iLine < nYSize; iLine++)
{
for(iCol = 0; iCol < nXSize; iCol++)
{
ii = iLine * nXSize + iCol;
/* Source raster pixels may be obtained with SRCVAL macro */
x0 = SRCVAL(papoSources[0], eSrcType, ii);
x3 = SRCVAL(papoSources[1], eSrcType, ii);
x4 = SRCVAL(papoSources[2], eSrcType, ii);
x8 = SRCVAL(papoSources[3], eSrcType, ii);
pix_val = 1;
GDALCopyWords(
&pix_val,
GDT_Float64,
0,
((GByte *)pData) + nLineSpace * iLine + iCol * nPixelSpace,
eBufType,
nPixelSpace,
1
);
}
}
return CE_None;
}
void GDALRegisterMe()
{
std::cout << "Inside GDALRegisterME()" << std::endl;
GDALAddDerivedBandPixelFunc("OneFunction", OneFunction);
}
Compilation:
g++ -std=c++20 -fPIC -lgdal -c src/gdalPixelFunctions.cpp -o
build/gdal_pixelFunctions.o
g++ -lgdal -shared build/gdal_pixelFunctions.o -o
build/gdal_pixelFunctions.so
export GDAL_DRIVER_PATH="/path/to/build"
Attempting to call:
gdal_translate testVrt.vrt testVrt.tif
(where testVrt.vrt references the OneFunction pixel function) results in
the following error messages:
ERROR 1: /path/to/build/gdal_pixelFunctions.so: undefined symbol:
GDALRegisterMe
ERROR 1: /path/to/build/gdal_pixelFunctions.so: undefined symbol:
GDALRegister_pixelFunctions
I have also tried registering by defining a void
GDALRegister_pixelFunctions() but with the same issue. I assume this
error means that GDAL is looking in the shared library for these two
register functions and failing to find them?
Thank you for your help and sorry for the long post!
More information about the gdal-dev
mailing list