[gdal-dev] Registering C++ Pixel Functions for Command-Line Utilities

Conor McIndoe conormcindoe1 at gmail.com
Tue Jan 12 04:46:28 PST 2021


Wonderful, thank you Thomas, that has indeed resolve the issue

Best,

Conor

On 12/01/2021 12:02, thomas bonfort wrote:
> Conor,
> I suspect that you should add an
> extern "C" {
> void GDALRegisterMe();
> }
> line at the beginning of your cpp file.
>
> --
> Thomas
>
> On Tue, Jan 12, 2021 at 12:56 PM Conor McIndoe 
> <conormcindoe1 at gmail.com <mailto:conormcindoe1 at gmail.com>> wrote:
>
>     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
>     <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
>     <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!
>
>     _______________________________________________
>     gdal-dev mailing list
>     gdal-dev at lists.osgeo.org <mailto:gdal-dev at lists.osgeo.org>
>     https://lists.osgeo.org/mailman/listinfo/gdal-dev
>     <https://lists.osgeo.org/mailman/listinfo/gdal-dev>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20210112/98728141/attachment.html>


More information about the gdal-dev mailing list