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

thomas bonfort thomas.bonfort at gmail.com
Tue Jan 12 04:02:39 PST 2021


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>
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) 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!
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> 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/a332c5a5/attachment-0001.html>


More information about the gdal-dev mailing list