[geos-devel] creating & importing geos-3.3.3 static libgeos.lib on Windows

Dave Cottlehuber dch at apache.org
Wed May 30 07:54:10 PDT 2012


Hi,

I'm not sure how to include geos-3.3.3 as a static library into a
project, that will use an erlang<->C DLL interface.

According to https://github.com/libgeos/libgeos/commit/49463453fa2e871d1686c4c7d0c2efa5c280f92d
I should be using libgeos.lib to link against;

This should be sufficient, pretty-printed:

cl.exe
   -LD -MD -Zi -Wall
   -Ic:/erlang/lib/erl_interface-3.7.7/include
   -Ic:/erlang/usr/include
   -Iz:/source/erlgeom/deps/geos/include
   ..\c_src\erlgeom.c
 -link
   -LIBPATH:c:/erlang/lib/erl_interface-3.7.7/lib
   -LIBPATH:c:/erlang/usr/lib
   -LIBPATH:z:/source/erlgeom/deps/geos/lib
  erl_interface.lib
  ei.lib
  libgeos.lib

However this doesn't compile, 24 missing references such as:

    LNK2019: unresolved external symbol _GEOSCoordSeq_setY

Adding geos_c.lib fixes the compilation issue, but it appears to be
the .lib file for the actual DLLs, not the static library libgeos.lib. I'm
not sure but this looks a little like the issue noted here:
http://mail.kde.org/pipermail/kde-buildsystem/2006-May/002805.html

"I just tried this on windows by hand and it has some interesting
effects.  The static .lib file that is produced is full of objects that
have dllexport tags.  When it is linked into an executable, say foo.exe,
the linker produces a foo.lib import library.  Another problem on
windows is that the static library cannot have the same name as the dll
or it will clobber the import library paired with the dll.  This means
that any target property we create to specify this behavior will also
have to specify an alternative name for the archive."

Geos is built from github checkout of 3.3.3 tag using MS SDK 7.1
from the setenv command prompt, and then:

    path=%path%;c:\mozilla-build\7zip;c:\opt\cmake\bin;c:\erlang\bin;c:\openssl\bin;
    autogen.bat
    mkdir dist build & cd build
    cmake -G "Visual Studio 10" ..
    cmake -DCMAKE_INSTALL_PREFIX=..\dist  ..
    cmake --build ..\build --target install --config Release

Which works nicely, and creates 3 .libs:

   Directory of Z:\source\libgeos\dist\lib
   05/30/2012  03:03 PM         1,608,376 geos.lib
   05/30/2012  03:03 PM           286,934 geos_c.lib
   05/30/2012  03:02 PM        17,683,582 libgeos.lib

BTW make check however does not. I can't see this fixed in svn trunk,
do you want a ticket for it?

Z:\source\libgeos\build>    cmake --build ..\build --target check
--config Release

Microsoft (R) Visual Studio Version 10.0.40219.1.
Copyright (C) Microsoft Corp. All rights reserved.

The evaluation period for Visual Studio Trial ends in 23 days.
1>------ Build started: Project: ZERO_CHECK, Configuration: Release Win32 ------
2>------ Build started: Project: check, Configuration: Release Win32 ------
2>  Building Custom Rule Z:/source/libgeos/CMakeLists.txt
2>  CMake does not need to re-run because
Z:\source\libgeos\build\CMakeFiles\generate.stamp is up-to-date.
2>  Test project Z:/source/libgeos/build
2>      Start 1: geos_unit
2>  1/4 Test #1: geos_unit ........................***Failed    0.22 sec
2>      Start 2: xmltester
2>  2/4 Test #2: xmltester ........................   Passed    4.66 sec
2>      Start 3: bug234
2>  3/4 Test #3: bug234 ...........................   Passed    0.06 sec
2>      Start 4: TestSweepLineSpeed
2>  4/4 Test #4: TestSweepLineSpeed ...............   Passed    4.49 sec
2>
2>  75% tests passed, 1 tests failed out of 4
2>
2>  Total Test time (real) =   9.89 sec
2>
2>  The following tests FAILED:
2>        1 - geos_unit (Failed)
2>  Errors while running CTest
2>C:\Program Files
(x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5):
error MSB6006: "cmd.exe" exited with code 8.
========== Build: 1 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

A+
Dave


More information about the geos-devel mailing list