在Win32上编译

作者

珍珠层

联系

gmail.com上的pnaciona

警告

文档的这一部分已过时。 Nmake 已不再使用。 Cmake 也用于Win32。 Cmake 有关说明,请访问https://github.com/MapServer/MapServer/blob/main/README.WIN32.另请参阅https://github.com/MapServer/MapServer/blob/main/appveyor.yml.

介绍

本文档为Win32平台上的MapServer提供了一组简单的编译过程。

如果您已经做到了这一点,那么很可能您已经了解了MapServer,并且至少想尝试自己编译它。MapServer的预编译二进制文件可从各种来源获得。参照 Windows . 为Win32平台构建MapServer可能是一项艰巨的任务,因此,如果现有的二进制文件足以满足您的需要,强烈建议您优先使用它们来尝试从源代码构建所有内容。

但是,有多种原因需要从win32上的源代码构建mapserver。原因包括需要启用特定选项、使用其他版本的支持库(如gdal)进行构建、不支持核心构建的mapscript、需要调试和修复bug,甚至需要在mapserver中实现新功能。为了方便用户和开发人员,我列出了编译MapServer的步骤。每个步骤都提供了背景信息以及示例。每个示例都是前一个示例的延续,最后将生成mapserver dll(libmap.dll)、cgi程序(mapserv.exe)和实用程序。

警告

此文档可能引用旧的库版本。您可能希望尝试为生成使用更新的库版本。

编译器要求

从MapServer8.0开始,构建MapServer需要具有C++11和C99能力的编译器。例如,这意味着使用Microsoft Visual Studio 2015或更高版本。

编译

如果您是Windows编程新手,请仔细阅读本文档。编译步骤相当简单,但我在每个步骤中都添加了一些Blurbs,以帮助您了解MapServer是如何编译的。对于更有经验的程序员来说,也许阅读mapserver源代码附带的readme.win32会更有用。对于那些坐立不安的人,编译MpServer包括下载和解开源代码,编辑make文件,并从命令提示符中调用微软的Visual C++编译器。生成的mapserv.exe是安装在Web服务器的cgi bin目录中的cgi程序。

对于那些愿意花时间的人,编译步骤如下。

设置项目目录

在开始编译mapserver之前,我建议创建一个名为“projects”的目录,您可以在其中放置mapserver及其支持库的源代码。因为您将使用DOS样式的命令,所以您也可以习惯Windows命令提示。对于Windows95/98用户,命令处理器将被称为command.com。对于Windows NT/2000/XP,它将是cmd.exe。因此,启动旧的命令提示符,并转到要在其中创建项目目录的驱动器。

下面是如何在c:drive上创建名为projects的目录的示例:

C:\Users> mkdir C:\Projects

要转到该目录:

C:\Users> cd \Projects
C:\Projects>

从项目目录中,可以提取MapServer及其库的源代码。现在您可以下载源代码了。

下载MapServer源代码和支持库

创建项目目录后,下载MapServer源代码和支持库的代码,并将源代码包保存在新创建的“项目”目录中。这些源代码通常打包为zip或unix tar和gzip文件。你需要一个软件来解压这些包。 7-Zip 是可以处理这些文件的软件示例。

Cygwin是一个免费的开源软件包,它是这些工具在Windows上的一个端口。您可以使用此工具集合中的gzip和tar实用程序。Cygwin可从http://www.cygwin.com获得。

为了编译MapServer CGI程序,必须下载一些必需的和可选的库。在其最简单的配置中,mapserver只需要gd(提供图像输出)和regex(提供正则表达式支持)库。此配置允许开发人员/数据提供程序使用shapefiles作为输入,并根据使用的gd库版本,使用gif或png图像作为输出。以其他格式输入数据需要其他库。下面列出了使用MapServer的库。

MapServer源代码

MapServer源代码可以从 download page . 如果您想获得软件的当前开发版本,请遵循临时构建标题下的夜间快照链接。源代码的绝对最新副本可从 GitHub 但是,Github存储库不包含通常在Unix上生成的几个重要源文件(maplexer.c、mapparser.c和mapparser.h),因此如果可能,使用夜间快照比直接从 GitHub .

所需库

GD Library

MapServer使用GD图形库以GIF、PNG和JPEG格式呈现地图图像。这些地图图像使用MapServer CGI显示在Web浏览器客户端中。GD的当前官方版本是2.0.33。分布式生成文件被设置为在一个dll中使用预构建的gd win32 dll二进制文件,其中包括gd、libjpeg、libpng、libz、libgif和freetype 2。此包通常被列为“windows dll.zip”,最新版本通常在http://www.boutell.com/gd/http/gdw32.zip上提供。

Regex:

regex是MapServer使用的正则表达式库。可从http://ftp.gnu.org/old-gnu/regex/regex-0.12.tar.gz下载

可选库

JPEG library

如果从源代码生成gd,gd需要此库来呈现jpeg图像。您可以从http://www.ijg.org/files/jpegsrc.v6b.tar.gz下载此库。

PNG library

如果从源代码生成gd,gd需要此库来呈现png图像。您可以从http://sourceforge.net/projects/libpng下载此库。/

Zlib

libpng需要这个库来提供图形压缩支持。它可以在https://zlib.net/上下载。

FreeType 2

freetype通过gd在mapserver中提供TrueType支持。如果从源代码构建gd,我们只需要单独构建freetype。可从http://gnuwin32.sourceforge.net/packages/freetype.htm下载。

PROJ:

PROJ为MapServer提供实时投影支持。数据在不同投影系统中的用户可以使用此库重新投影到公共投影中。WMS、WFS或WCS服务也需要它。

GDAL/OGR

GDAL/OGR库允许MapServer读取各种地理空间栅格格式(GDAL)和矢量格式(OGR)。它可以在https://gdal.org/上下载。

ArcSDE

ArcSDE是ESRI专有的空间数据库引擎。大多数用户将无法访问它,但如果您拥有ArcSDE许可证,则可以使用其库授予MapServer访问SDE数据库的权限。

EPPL7号:
这个库允许MapServer读取EPPL7(“环境规划和编程

语言)数据集,以及旧的Erdas LAN/GIS文件。此库在MapServer中设置为默认库,因此没有特殊的源代码可供下载。

现在您已经查看了为MapServer提供支持的库,现在应该决定编译和使用哪些库了。我们将使用在Boutell.com上发布的预先构建的GD,其中包含PNG、GIF、JPEG和FreeType“内置”。如果你想提供OGC Web服务(即WMS,WFS)或者想执行动态重投影,那么就需要PROJ库。如果需要其他栅格和矢量数据源,请考虑包含GDAL/OGR支持。WCS服务也需要GDAL。

我们的示例需要所需的库和动态投影支持,因此我们需要下载GD、regex和PROJ库。去拿那些类库吧。

设置编译选项

MAPServer与许多支持库一样,带有VisualC++的Mag文件名为MaMaFiel.VC。它包括文件nmake.opt,其中包含许多特定于站点的定义。我们只需要编辑nmake.opt文件来配置本地站点选项的构建,并支持库。makefile.vc和nmake.opt模板文件由assefa yewondworsen和dm solutions人员提供。

从MapServer 4.4开始,默认的MapServer build选项仅包括GD和regex。MapServer是使用/MD选项构建的(这意味着应该使用MSVCRT.DLL),因此如果任何支持库是静态构建的(而不是作为DLL),那么在构建它们时也需要使用/MD。默认情况下,modern PROJ builds使用/MD,因此我们应该能够使用默认的PROJ build而无需调整。

该示例将使用GDWin32预构建的DLL以及regex-0.12和PROJ进行编译。PROJ支持将确保我们能够启用MapServer OGC-WMS兼容性。使用记事本或其他文本编辑器打开nmake.opt文件并进行以下更改。

评论

使用磅符号()注释要禁用的行,或删除磅符号以启用nmake选项。

A、 启用PROJ支持,并更新PROJ目录的路径。取消对PROJ=行和PROJ_DIR=行的注释,如下所示,并更新PROJ_DIR路径以指向您的PROJ构建。

# Reprojecting.
# If you would like MapServer to be able to reproject data from one
# geographic projection to another, uncomment the following flag
# PROJ distribution (cartographic projection routines).  PROJ is
# also required for all OGC services (WMS, WFS, and WCS).
#
# For PROJ_DIR use full path to PROJ distribution
PROJ=-DUSE_PROJ -DUSE_PROJ_API_H
PROJ_DIR=c:\projects\proj-4.4.9

如果稍后在文件中向下查看,可以看到一旦启用PROJ,MapServer将与PROJ存根库PROJ_i.lib链接,这意味着MapServer将使用PROJ.DLL,而不是PROJ中的静态链接。

  1. 取消对wms选项的注释。

# Use this flag to compile with WMS Server support.
# To find out more about the OpenGIS Web Map Server Specification go to
# http://www.opengis.org/
WMS=-DUSE_WMS_SVR
  1. 更新以使用gd。在我们的示例中,它应该是这样的。

GD_DIR=c:/projects/gdwin32
GD_LIB=$(GD_DIR)/bgd.lib

Note: makemsvcimport.bat 首先在gdw32目录中编写脚本。

d.确保regex路径设置正确。为了使“nmake/f makefile.vc clean”目标中的“delete”命令正常工作,必须在regex_dir定义中使用反斜杠。

# REGEX Library
#
# VC++ does not include the REGEX library... so we must provide our one.
# The following definitions will try to build GNU regex-0.12 located in the
# regex-0.12 sub-directory.
# If it was not included in the source distribution, then you can get it from:

#    ftp://ftp.gnu.org/pub/gnu/regex/regex-0.12.tar.gz
# Provide the full path to the REGEX project directory
# You do not need this library if you are compiling for PHP mapscript.
# In that case the PHP regex library will be used instead
!IFNDEF PHP
REGEX_DIR=c:\projects\regex-0.12
!ENDIF

现在设置了makefile。

编译库

在编译MapServer之前,必须首先编译其支持库。如何做到这一点对于每个库都是不同的。项目库a nmake /f makefile.vc proj-4.4.9src目录中的命令应该足够了。regex-0.12代码实际上是由mapserver构建过程构建的,因此您不需要在那里做任何事情。

编译libcurl

以前,可以使用以下命令编译curl库:

nmake /f makefile.vc6 CFG=release

这将创建一个静态库libcurl.lib,并对其进行编译。版本高于7.10.x的版本应编译为动态库。这是使用以下命令完成的:

nmake /f makefile.vc6 CFG=release-dll

然后,您需要编辑mapserver的nmake.opt,用此行替换curl_lib变量:

CURL_LIB = $(CURL_DIR)/lib/libcurl_imp.lib

编译映射服务器

一旦成功编译了支持库,就可以开始最后的编译步骤了。如果尚未执行此操作,请打开命令提示符,并通过运行通常位于 C:程序文件Microsoft Visual StudioVC98binVCVARS32.bat.

C:\Users> cd \projects\MapServer
C:\Projects\MapServer&> C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat"
C:\Projects\MapServer>

Setting environment for using Microsoft Visual C++ tool.
C:\Projects\MapServer>

现在发出命令: nmake /f Makefile.vc 然后等待它完成编译。如果编译成功,则应获取mapserver.lib、libmap.dll、mapserv.exe和其他.exe文件。这就是编译过程。如果遇到问题,请阅读第4节关于编译错误的内容。您还可以向mapserver dev电子邮件列表中的帮助人员寻求帮助。

使用PostGIS支持编译MapServer

要将PostGIS支持编译到MapServer中,您需要执行以下操作:

  1. 从ftp://ftp.heanet.ie/pub/postgresql/source下载PostgreSQL 8.0.1(或更高版本)源/

  2. 我将它们提取到c:projectspostgresql-8.0.1

  3. 下载 Microsoft Platform SDK 否则会在shfolder.lib上出现链接错误。

  4. 使用win32.mak makefile在c:projectspostgresql-8.0.1srcinterfaceslibpq下编译libpq

  5. 将所有内容从C:projectspostgresql-8.0.1srcinterfaceslibpqrelease复制到C:projectspostgresql-8.0.1srcinterfaceslibpq,因为mapserver makefile将尝试在其中找到它

  6. 在nmake.opt for mapserver中定义以下内容:postgis=-duse-postgis-postgis-dir=c:/projects/postgresql-8.0.1/src

  7. nmake/f生成文件.vc

  8. 不要忘记将libpq.dll(从c:projectspostgresql-8.0.1srcinterfaceslibpqrelease)复制到MapServer可以找到它的位置。

常见编译错误

下面是您在构建MapServer时可能遇到的一些常见错误。

  • Visual C++工具没有正确初始化。::

    C:\projects\MapServer> nmake -f /makefile.vc
    'nmake' is not recognized as an internal or external command,
    operable program or batch file.
    

    如果您没有正确定义从命令shell使用ms-visualc++所需的路径和其他环境变量,就会发生这种情况。调用vcvars32.bat脚本,通常使用命令 C:Program FilesMicrosoft Visual StudioVC98binvcvars32.bat 或者类似的东西,如果在另一个位置安装了Visual Studio。要测试VC++是否可用,只需在命令shell中键入“nmake”或“cl”,并确保找到它。

  • regex生成问题。::

    regex.obj : error LNK2001: unresolved external symbol _printchar
    libmap.dll : fatal error LNK1120: 1 unresolved externals
    NMAKE : fatal error U1077: 'link' : return code '0x460'
    Stop.
    

    如果使用我们引用的stock regex-0.12,就会发生这种情况。我通过注释printchar()函数的“extern”语句来解决这个问题,并将其替换为regex-0.12regex.c中的存根实现。

    //extern void printchar ();
    void printchar( int i ) {}
    
  • 缺少gd导入库。::

    LINK : fatal error LNK1104: cannot open file 'c:/projects/gdwin32/bgd.lib'
    NMAKE : fatal error U1077: 'link' : return code '0x450'
    Stop.
    

    如果您使用的是预构建的gd二进制文件,那么仍然需要运行 makemsvcimport.bat 在gdw32目录中编写脚本以创建与vc++兼容的存根库(bgd.lib)。

安装

我们最感兴趣的文件是mapserv.exe。其他可执行文件是MapServer实用程序。

了解有关这些实用程序的更多信息。

要测试CGI程序是否正常工作,请在命令提示下键入mapserv.exe。您应该看到以下消息:

This script can only be used to decode form results and
should be initiated as a CGI process via a httpd server.

相反,您可能会得到一个弹出窗口,指示缺少一个dll(如bgd.dll)。您需要将所有必需的dll(即bgd.dll和proj.dll)复制到与mapserv.exe程序相同的目录中。

现在在命令提示下键入mapserv-v以获取此消息:

MapServer version 4.4.0-beta3 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP
SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER INPUT=SHAPEFILE
DEBUG=MSDEBUG

这告诉我们mapserv.exe支持哪些数据格式和其他选项。假设已设置Web服务器,请将mapserv.exe、libmap.dll、bgd.dll、proj.dll和任何其他必需的dll复制到cgi bin目录。

现在您可以下载演示应用程序并试用自己的MapServer CGI程序了。如果愿意,还可以创建一个目录来存储实用程序。我建议在“projects”目录下创建一个名为“bin”的子目录,并将可执行文件复制到该子目录。在开发MapServer应用程序时,您可能会发现这些程序很有用。

其他有用信息

mapserver unix编译和安装howto对一些mapserver编译选项和库问题有很好的描述。我将在下一次修订本Howto时详细介绍这些选项和问题。

每个支持库的自述文件都为Windows提供编译说明。

MapServer用户社区对MapServer编译的细微差别有着共同的认识。明智地征求他们的意见。

确认

感谢Assefa Yewondwossen提供makefile.vc。如果没有那份文件,我就无法写下这个howto。

感谢BartvandenEijnden提供libcurl和postgis编译信息。

感谢Steve Lime开发了MapServer,感谢许多开发人员为保持MapServer项目的成功付出了时间和精力。