[postgis-users] Building PostGis with VC++
Charlie Savage
cfis at savagexi.com
Tue Aug 28 18:17:22 PDT 2007
To track down a bug I was seeing in PostGIS on Windows, I took the time
to build postgresql, postgis and geos using VC++ (the mingw/gdb combo
really doesn't cut it for debuggin). It took about a day to port
PostGis - the details are below.
I'd be happy to feed this back into the community if there is any
interest. If there is, should I submit my changes as patches, in the bug
tracking system, or just commit them (not sure if I have commit access
to postgis, are permissions shared with geos)?
Note there is one major issue however that needs to be fixed in proj4's
api - see details below - that I would need help from Frank or others on.
Last - if this doesn't seem that interesting, remember that the
postgresql group has been spending a fair bit of time in the 8.3 release
cycle improving postgresql's MSVC++ support. So I'd expect at least a
fair number of people to start using it for postgresql due to the pain
of using mingw/msys.
Thanks,
Charlie
------------------------------------------
Getting PostGis to compile required a combination of various things.
First of course a few twiddling code changes:
* Fix variable initialization issues that GCC allows but VC++ doesn't:
some_method()
{
if (...)
{}
int foo = 7; <--- This is no go with V++, foo must be declared above)
}
* Move various #defines into config.h (POSTGIS_VERSION, etc.) - I just
created config.h.vc
* VC++ thought MAX_FLOAT was too big (3.40282347e+38F versus
3.402823466e+38F)
* The method createTree must use some GCC magic to initialize a variable
sized array:
RTREE_NODE *nodes[pointArray->npoints];
That has to be done via malloc/free on Windows.
Second was reimplementing various functions not on widows (rint in
particular) and a few header files (inttypes.h, etc.)
Third - and the big issue - the interface with proj4 needs to be fixed.
On windows, its a no-no to mess with other dll's memory. Postgis
accesses two global variables exposed by proj4. This works ok if you
statically link to the proj4 library but not if you try to use the
proj4.dll.
The first issue is pj_release. That was easily fixed by using
pj_get_release() instead.
However, the one I couldn't solve was pj_errno. In one place the
postgis code doesn't try to initialize it. Of course proj4 does, so to
proj4 its zero, to postgis is a random number. Thus postgis thinks that
proj4 *always* fails when calling transform. In a second place, postgis
does try to initialize pj_errno which causes a segmentation fault.
The solution is to expose a function pj_get_errno() or some such in
proj4. There actually is such a beast but it returns a pointer to the
errno, not the errno, so it doesn't work as is. Can we just change this
method to return the errno instead? Will this break existing clients?
If so, can we addd a new function to the api?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3237 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20070828/95f955b6/attachment.bin>
More information about the postgis-users
mailing list