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