Mapnik 在 Windows 10 下的源码编译指南
Mapnik 是一个用于构建地图应用程序的开源 C++ 库。在 Windows 环境下进行源码编译,由于依赖项众多且版本复杂,往往需要花费不少精力。以下整理了一套经过验证的编译流程,涵盖环境准备、依赖构建及最终打包步骤。
环境准备
首先确保开发机器上安装了必要的工具链。推荐使用 Visual Studio 2010(或兼容版本),配合 Git、Cygwin 以及 GnuWin32 工具集。
必备工具清单:
- Visual Studio 2010
- Git
- Cygwin (含 patch, curl, unzip 等)
- GnuWin32
注意:部分工具如
wget和curl在 Cygwin 环境中可用,若使用原生 CMD 请确保路径配置正确。
环境变量配置
编译前需设置好根目录及各类依赖的版本变量。建议将以下命令添加到系统环境变量或每次编译前在命令行中执行。
set PATH=%PATH%;c:\git\bin;c:\cygwin\bin;c:\GnuWin32\bin
set ROOTDIR=c:\dev2
cd %ROOTDIR%
mkdir packages
set PKGDIR=%ROOTDIR%/packages
:: 版本定义,需与实际下载包一致
set ICU_VERSION=4.8
set BOOST_VERSION=49
set ZLIB_VERSION=1.2.8
set LIBPNG_VERSION=1.5.17
set JPEG_VERSION=8d
set WEBP_VERSION=0.4.0
set FREETYPE_VERSION=2.4.9
set POSTGRESQL_VERSION=9.1.3
set TIFF_VERSION=4.0.0beta7
set PROJ_VERSION=4.8.0
set PROJ_GRIDS_VERSION=1.5
set GDAL_VERSION=1.9.0
set LIBXML2_VERSION=2.7.8
set PIXMAN_VERSION=0.28.2
set CAIRO_VERSION=1.12.14
set SQLITE_VERSION=3071100
set EXPAT_VERSION=2.1.0
set GEOS_VERSION=3.3.3
获取与解压依赖包
Mapnik 依赖约 18 个第三方库。可以通过脚本批量下载,若网络受限建议手动下载至 %PKGDIR% 目录。
:: 补丁文件
wget https://raw.github.com/mapnik/mapnik-packaging/master/windows/cairo-win32.patch --no-check-certificate
wget https://raw.github.com/mapnik/mapnik-packaging/master/windows/libxml.patch --no-check-certificate
cd %PKGDIR%
:: 核心依赖下载示例
curl http://iweb.dl.sourceforge.net/project/boost/boost/1.%BOOST_VERSION%.0/boost_1_%BOOST_VERSION%_0.tar.gz -O
curl http://www.zlib.net/zlib-%ZLIB_VERSION%.tar.gz -O
curl http://download.osgeo.org/gdal/gdal-%GDAL_VERSION%.tar.gz -O
:: ... 其他依赖依此类推 ...
cd %ROOTDIR%
依赖库编译
这是最耗时的一步。每个库都需要单独处理,部分库需要修改配置文件以适配 MSVC 编译器。
1. ICU 与 Boost
ICU 使用 msbuild 直接编译解决方案。Boost 则需要先 bootstrap 再指定 toolset 编译。
:: ICU 编译
bsdtar xvfz %PKGDIR%\icu4c-4_8_1_1-src.tgz
cd icu/
msbuild source\allinone\allinone.sln /t:Rebuild /p:Configuration="Release" /p:Platform=Win32
cd %ROOTDIR%
:: Boost 编译
bsdtar xzf %PKGDIR%/boost_1_%BOOST_VERSION%_0.tar.gz
cd boost_1_%BOOST_VERSION%_0
set BOOST_PREFIX=boost-%BOOST_VERSION%-vc100
bootstrap.bat
bjam toolset=msvc-10.0 --prefix=..\%BOOST_PREFIX% \
--with-thread --with-filesystem --with-date_time \
--with-system --with-program_options --with-regex \
--with-chrono -disable-filesystem2 \
-sHAVE_ICU=1 -sICU_PATH=%ROOTDIR%\icu \
release link=static install --build-type=complete
2. 图形与图像库 (WebP, JPEG, FreeType, PNG, Tiff, Pixman, Cairo)
这些库通常涉及 NMake 或 MSBuild。需注意路径引用和头文件包含顺序。
:: WebP & JPEG
unzip %PKGDIR%\libwebp-%WEBP_VERSION%-windows-x86.zip
rename libwebp-%WEBP_VERSION%-windows-x86 webp
unzip %PKGDIR%\jpegsr%JPEG_VERSION%.zip
rename jpeg-%JPEG_VERSION% jpeg
cd jpeg
nmake /f Makefile.vc nodebug=1
cd %ROOTDIR%
:: FreeType
bsdtar xfz "%PKGDIR%\freetype-%FREETYPE_VERSION%.tar.gz"
rename freetype-%FREETYPE_VERSION% freetype
cd freetype
msbuild builds\win32\vc2010\freetype.sln /p:Configuration=Release /p:Platform=Win32
move objs\win32\vc2010\freetype249.lib freetype.lib
cd %ROOTDIR%
:: LibPNG
bsdtar xvfz %PKGDIR%\libpng-%LIBPNG_VERSION%.tar.gz
rename libpng-%LIBPNG_VERSION% libpng
cd %ROOTDIR%\libpng\projects\vstudio\
msbuild vstudio.sln /t:Rebuild /p:Configuration="Release" /p:Platform=Win32
cd %ROOTDIR%\libpng
move projects\vstudio\Release\libpng15.lib libpng.lib
move projects\vstudio\Release\zlib.lib ..\zlib-1.2.5\zlib.lib
cd %ROOTDIR%
:: Tiff (需修改 nmake.opt 开启 JPEG/ZLIB 支持)
bsdtar xvfz %PKGDIR%\tiff-%TIFF_VERSION%.tar.gz
rename tiff-%TIFF_VERSION% tiff
cd tiff
:: 此处省略 sed 替换逻辑,确保 nmake.opt 中 JPEG_SUPPORT 和 ZIP_SUPPORT 为 1
nmake /f Makefile.vc
cd %ROOTDIR%
:: Pixman & Cairo
bsdtar xvfz %PKGDIR%\pixman-%PIXMAN_VERSION%.tar.gz
rename pixman-%PIXMAN_VERSION% pixman
cd pixman\pixman
make -f Makefile.win32 "CFG=release"
cd %ROOTDIR%
:: Cairo 编译前需修改 build\Makefile.win32.features 和 .common
:: 确保 CAIRO_HAS_FT_FONT=1,并修正 zlib 和 freetype 路径
set INCLUDE=%INCLUDE%;%ROOTDIR%\zlib-1.2.5
set INCLUDE=%INCLUDE%;%ROOTDIR%\libpng
set INCLUDE=%INCLUDE%;%ROOTDIR%\pixman\pixman
set INCLUDE=%INCLUDE%;%ROOTDIR%\cairo\boilerplate
set INCLUDE=%INCLUDE%;%ROOTDIR%\cairo
set INCLUDE=%INCLUDE%;%ROOTDIR%\cairo\src
set INCLUDE=%INCLUDE%;%ROOTDIR%\freetype\include
make -f Makefile.win32 "CFG=release"
del src\cairo-version.h
cd %ROOTDIR%
3. 数据库与 XML 库 (PostgreSQL, LibXML2, SQLite, Proj4, GEOS)
这部分主要涉及 NMake 和 CMake。
:: PostgreSQL (libpq)
bsdtar xvfz "%PKGDIR%\postgresql-%POSTGRESQL_VERSION%.tar.gz"
rename postgresql-%POSTGRESQL_VERSION% postgresql
cd postgresql\src
nmake /f win32.mak
:: 若遇到 mt.EXE 错误可忽略,只要生成 libpq.lib 即可
cd %ROOTDIR%
:: LibXML2
cscript configure.js compiler=msvc prefix=%ROOTDIR%\libxml2 iconv=no icu=yes include=%ROOTDIR%\icu\include lib=%ROOTDIR%\icu\lib
patch -p1 < %ROOTDIR%\libxml.patch
nmake /f Makefile.msvc
cd %ROOTDIR%
:: Proj4
bsdtar xfz %PKGDIR%\proj-%PROJ_VERSION%.tar.gz
rename proj-%PROJ_VERSION% proj
cd proj\nad
unzip -o ../../packages/proj-datumgrid-%PROJ_GRIDS_VERSION%.zip
cd ..
nmake /f Makefile.vc
cd %ROOTDIR%
:: GDAL
bsdtar xvfz %PKGDIR%\gdal-%GDAL_VERSION%.tar.gz
mkdir gdal
rename gdal-%GDAL_VERSION% gdal\gdal
cd gdal\gdal
:: 手动修改 nmake.opt 中的 EXPAT_DIR 路径
nmake /f makefile.vc MSVC_VER=1600
cd %ROOTDIR%
:: SQLite
unzip %PKGDIR%\sqlite-amalgamation-%SQLITE_VERSION%.zip
rename sqlite-amalgamation-%SQLITE_VERSION% sqlite
:: Protobuf
:: 下载 protobuf-2.5.0.zip 后解压,运行 vcupgrade 转换项目文件
msbuild libprotobuf-lite.vcxproj /p:Configuration="Release" /p:Platform=Win32
extract_includes.bat
cd %ROOTDIR%
:: GEOS
bsdtar xvf %PKGDIR%\geos-%GEOS_VERSION%.tar.bz2
rename geos-%GEOS_VERSION% geos
cd geos\mkdir build
cd build
cmake -G "NMake Makefiles" ..
nmake /f Makefile geos
cd %ROOTDIR%
编译 Mapnik 主程序
完成所有依赖后,即可开始编译 Mapnik 本身。
- 克隆源码:
git clone https://github.com/mapnik/mapnik.git -b 2.3.x mapnik
cd %ROOTDIR%\mapnik
- 使用官方提供的 packaging 脚本辅助编译:
git clone https://github.com/mapnik/mapnik-packaging.git
cd mapnik-packaging\windows
-
修改
build_mapnik.bat中的路径,确保指向你刚才编译好的依赖库位置。 -
运行批处理脚本开始编译。
验证结果
编译成功后,应在输出目录中找到 mapnik.dll 和 mapnik.lib 文件。这标志着核心库已就绪,可以链接到你的项目中。
提示:整个流程涉及大量依赖库的版本匹配和路径配置,过程中可能会遇到各种编译报错。建议保持耐心,根据具体错误信息调整配置。Linux 下编译相对简单(可使用 apt 安装依赖),但在 Windows 上手动管理依赖是必经之路。

