[geos-devel] GEOS and VC++ 2005
Charlie Savage
cfis at interserv.com
Sat Jan 7 19:09:20 EST 2006
Hi everyone,
I'm trying to compile GEOS HEAD using Visual C++ 2005. I had to patch a
couple files, which I explain below (patch is also attached below).
There is however a more fundamental issue which is setting up the right
exports for libgeos.dll. This is generally done via
dllexport/dllimport, just like in libgeos_c. Since libgeos.dll exports
C++ classes, you can dllexport all the classes. Of course any such
exported classes can only be used by code compiled by VC++ due to C++
name mangling. The same if also true if you are using any other
compiler, for example MingW, to build libgeos.dll - it can only be
linked against by MinGW.
Anyway, there are few solutions. First, do nothing and disallow the
creation of dlls using VC++ (you could build static libraries instead).
Second, add the right dllExport/dllImport macros to the class
definitions. Third, and what I did, manually construct a def file by
using information extracted from the dll by dumpbin or the VC++ /MAP
option. The third option isn't very good because it is manually
intensive and fairly brittle - although I suppose you could automate it
using a fair bit of scripting magic.
Anyway, being able to build geos with VC++ is useful, because it makes
it easier to build extensions for Ruby and Python, both of which are
compiled using VC++ on Windows.
Just my two cents.
Thanks,
Charlie
-------------------------------
The following patches are needed to build GEOS with Visual Studio C++
2005. I've tested them against both VC++ and MinGW on Windows. Note I
have also created updated Visual Studio C++ if anyone is interested
(the old that was removed from CVS no longer works).
1. The main issue is from geomgraph.h, lines 490 and 491:
EdgeIntersectionListIterator begin() const { return nodeMap.begin(); }
EdgeIntersectionListIterator end() const { return nodeMap.end(); }
Where:
typedef set<EdgeIntersection *, EdgeIntersectionLessThen>::iterator
EdgeIntersectionListIterator;
VC++ does not compile this because it complains that a non-const
iterator is being returned from a function that is marked const. It
seems to me that VC++ is correct, and this should not be allowed. The
fix is easy enough, return an const_iterator (which I called
EdgeIntersectionListIterator Const) instead of a iterator. This then
effects a couple of places in the code.
2. geos_c.cpp, line 1570.
return (finite(az) && az != DoubleNotANumber);
There is not a finite function, but there is a FINITE macro. So I
switched to the macro.
3. GeometricShapeFactory, line 202
if (angSize <= 0.0 || angSize > 2 * M_PI) //3.14159265358979
M_PI does not seem defined on Windows, so I defined it at the top of the
file.
Thanks,
Charlie
-----------------------------------------------
Index: source/geomgraph/EdgeIntersectionList.cpp
===================================================================
RCS file: /home/cvs/postgis/geos/source/geomgraph/EdgeIntersectionList.cpp,v
retrieving revision 1.16
diff -u -r1.16 EdgeIntersectionList.cpp
--- source/geomgraph/EdgeIntersectionList.cpp 8 Dec 2005 01:11:29
-0000 1.16
+++ source/geomgraph/EdgeIntersectionList.cpp 7 Jan 2006 23:48:53 -0000
@@ -65,7 +65,7 @@
bool
EdgeIntersectionList::isIntersection(const Coordinate& pt) const
{
- EdgeIntersectionListIterator it=nodeMap.begin(), endIt=nodeMap.end();
+ EdgeIntersectionListIteratorConst it=nodeMap.begin(),
endIt=nodeMap.end();
for (; it!=endIt; ++it)
{
EdgeIntersection *ei=*it;
@@ -158,7 +158,7 @@
EdgeIntersectionList::print() const
{
string out="Intersections: ";
- EdgeIntersectionListIterator it=begin(), endIt=end();
+ EdgeIntersectionListIteratorConst it=begin(), endIt=end();
for (; it!=endIt; ++it) {
EdgeIntersection *ei=*it;
out+=ei->print();
Index: source/util/GeometricShapeFactory.cpp
===================================================================
RCS file: /home/cvs/postgis/geos/source/util/GeometricShapeFactory.cpp,v
retrieving revision 1.8
diff -u -r1.8 GeometricShapeFactory.cpp
--- source/util/GeometricShapeFactory.cpp 8 Dec 2004 13:54:44
-0000 1.8
+++ source/util/GeometricShapeFactory.cpp 7 Jan 2006 23:48:53 -0000
@@ -17,6 +17,10 @@
#include <geos/util.h>
#include <stdio.h>
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
namespace geos {
/*
Index: source/headers/geos/geomgraph.h
===================================================================
RCS file: /home/cvs/postgis/geos/source/headers/geos/geomgraph.h,v
retrieving revision 1.26
diff -u -r1.26 geomgraph.h
--- source/headers/geos/geomgraph.h 7 Dec 2005 19:18:23 -0000 1.26
+++ source/headers/geos/geomgraph.h 7 Jan 2006 23:48:53 -0000
@@ -464,6 +464,7 @@
};
typedef set<EdgeIntersection *, EdgeIntersectionLessThen>::iterator
EdgeIntersectionListIterator;
+typedef set<EdgeIntersection *,
EdgeIntersectionLessThen>::const_iterator EdgeIntersectionListIteratorConst;
/**
* A list of edge intersections along an Edge.
@@ -486,8 +487,8 @@
EdgeIntersectionListIterator begin() { return nodeMap.begin(); }
EdgeIntersectionListIterator end() { return nodeMap.end(); }
- EdgeIntersectionListIterator begin() const { return nodeMap.begin(); }
- EdgeIntersectionListIterator end() const { return nodeMap.end(); }
+ EdgeIntersectionListIteratorConst begin() const { return
nodeMap.begin(); }
+ EdgeIntersectionListIteratorConst end() const { return nodeMap.end(); }
bool isEmpty() const;
bool isIntersection(const Coordinate& pt) const;
Index: source/capi/geos_c.cpp
===================================================================
RCS file: /home/cvs/postgis/geos/source/capi/geos_c.cpp,v
retrieving revision 1.19
diff -u -r1.19 geos_c.cpp
--- source/capi/geos_c.cpp 13 Dec 2005 23:03:25 -0000 1.19
+++ source/capi/geos_c.cpp 7 Jan 2006 23:48:53 -0000
@@ -1567,7 +1567,7 @@
double az = g->getCoordinate()->z;
//sprintf(msg, "ZCoord: %g", az);
//ERROR_MESSAGE(msg);
- return (finite(az) && az != DoubleNotANumber);
+ return (FINITE(az) && az != DoubleNotANumber);
}
int
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 2781 bytes
Desc: S/MIME Cryptographic Signature
Url : http://lists.osgeo.org/pipermail/geos-devel/attachments/20060107/45ae6bc0/smime.bin
More information about the geos-devel
mailing list