[GRASS-user] grass6.4 develbrunch revision 32726: undefined
reference to `G_no_gisinit'
giohappy at gmail.com
Thu Aug 14 05:06:14 EDT 2008
Thanks Glynn, excellent explanation!
I didn't know that such a backward check on library version could be
done... my ignorance :-)
So, you suggest to avoid gdal --with-grass. What if I need to access
grass datas from outside grass, like with gdal/ogr utilities?
2008/8/14 Glynn Clements <glynn at gclements.plus.com>:
> G. Allegri wrote:
>> I understand that everything that needs GRASS has to be recompiled if
>> this version changes so much to change its interface (QGis-GRASS
>> plugin, GRASS-GDAL plugin, etc.). But I would like to know why the new
>> develbrunch_6 revision needs the GDAL itself to be recompiled. I can
>> understand it if GRASS would need a newer version of GDAL... is this
>> the case?
> You only need to re-compile GDAL itself if GDAL was built with GRASS
> support (--with-grass).
> In your original message, you wrote:
>> Even switching to develbrunch I receive the same error:
>> usr/local/lib/libgdal.so: undefined reference to `G_no_gisinit'
> This indicates that your GDAL library was indeed built --with-grass. I
> suggest building it without that option, and using the GDAL-GRASS
> plugin instead.
> If you build GDAL -with-grass, you will need to re-compile GDAL every
> time that GRASS is updated from now on. The problem arises from
> r32695, which makes G_gisinit() check that libgis was built with the
> same version of gis.h as the caller.
> The change adds G_gisinit() and G_no_gisinit() macros:
> #define GIS_H_VERSION "$Revision: 32726 $"
> #define G_gisinit(pgm) G__gisinit(GIS_H_VERSION, (pgm))
> #define G_no_gisinit() G__no_gisinit(GIS_H_VERSION)
> The value of GIS_H_VERSION is automatically updated to the SVN
> revision whenever gis.h is updated.
> The change also renames the functions to G__gisinit() and
> G__no_gisinit() (which is why you get the "undefined reference" error
> when using an old GDAL with a new libgis), and adds version checks:
> int G__gisinit(const char *version, const char *pgm)
> if (strcmp(version, GIS_H_VERSION) != 0)
> G_fatal_error(_("Incompatible library version for module"));
> Any code which uses G_gisinit() or G_no_gisinit() passes the version
> of gis.h with which it was compiled to the library functions, which
> check that the same version of gis.h was used to compile the library.
> The rationale is to avoid having to track down subtle errors caused by
> version incompatibilities between libgis and any code which uses it.
> Now, if there is an incompatibility, you get a very unsubtle error
> telling you that there's an incompatibility.
> Glynn Clements <glynn at gclements.plus.com>
More information about the grass-user