MinGW 如何编译 libiconv,libz,libjpeg…
原文地址:http://www.gaia-gis.it/spatialite-2.4.0-3/mingw_how_to.html
Index of contents
- the MinGW + MSYS environment
- Step 1) installing libiconv
- Step 2) building libz
- Step 3) building libjpeg
- Step 4) building libpng
- Step 5) building libtiff
- Step 6) building libproj
- Step 7) building libgeotiff
- Step 8) building libgeos
- Step 9) building expat
- Step 10) building libspatialite
- Step 11) building spatialite-tools
- Step 12) building libgaiagraphics
- Step 13) building wxWidgets MSW
- Step 14) building libharu
the MinGW + MSYS environment
MinGW is an open source C/C++ compiler based on the popular gcc; MSYS is a command shell supporting a minimalistic Linux-like environment on Windows.Using both them you can build standard open source software [originally developed for Linux] under Windows as well, simply using the classic build tool-chain, as in:
./configure
make
make install
Quite obviously, Windows isn't exactly the same as Linux, so you cannot expect to get always an easy and painless build.
May well be you have to adapt something here and there in order to get a successful build under Windows.
The following notes are aimed exactly to this goal: allow you to avoid wasting your time while fighting against oddities that can quite easily solved.
We'll suppose you are using the current MinGW 5.1.4 and MSYS 1.0.10
So, if you have installed anything using the default settings [the wisest thing to do], now you have the following path correspondence:
C:\msys\1.0\local will be mapped [in the MSYS own perspective] as: /usr/local
Accordingly, this one will be the standard home for any software you'll then build and install.
Step 1) installing libiconv
libiconv is the standard GNU library supporting locale charsets.Required by: libspatialite, spatialite-tools
Building under Windows is really difficult, so the easiest way is the one to install the precompiled binaries.
- download libiconv-win-x86-1.9.2.zip
- uncompress this zip-file
- then manually copy any file respectively on:
- C:\msys\1.0\local\bin
- C:\msys\1.0\local\include
- C:\msys\1.0\local\lib
Step 2) building libz
libz is a popular library implementing Deflate, i.e. the compression algorithm used by gzip and Zip.Required by: libpng, libtiff, librasterlite
Building under Windows is quite easy, but requires to pay some attenction.
- download the latest sources: zlib125.zip
- uncompress this zip-file
- then open an MSYS shell
cp win32/Makefile.gcc .
make -f Makefile.gcc
export "INCLUDE_PATH=/usr/local/include"
export "LIBRARY_PATH=/usr/local/lib"
make install -f makefile.gcc
cp zlib1.dll /usr/local/bin
cp libzdll.a /usr/local/lib
This will build and install both the static library and the DLL as well.
Anyway this process will not generate the libz.la file (which is required to build libtiff in one of the following steps.
So in order to get a fully installed libz you have to accomplish a further operation:
- download libz.la
- and then copy this file: cp libz.la /usr/local/lib
Step 3) building libjpeg
libjpeg is a popular library supporting the JPEG image compression.Required by: libtiff, librasterlite
Important notice: you can now choose between two alternative implementations:
- libjpeg is the standard, plain library
- libjpeg-turbo is a new library, that fully takes profit from the most recent Intel/AMD CPUs
If you are planning to deploy your software on such platforms, then using libjpeg-turbo can ensure a 200% performance boost (and even more than this).
I strongly recommend using libjpeg-turbo: both libraries share the same identical API/ABI (they are absolutely inter-changeable), but libjpeg-turbo runs in an impressively faster mode.
How-to-build libjpeg-turbo
Please note: the NASM assembler is absolutely required: if you don't have it already installed on your system, you can download and install now.- download the latest sources: libjpeg-turbo-1.0.0..tar.gz
- uncompress this zip-file
- then open an MSYS shell
./configure --prefix=/usr/local
make
make install-strip
This will build and install both the static library and the DLL as well.
How-to-build libjpeg
- download the latest sources: jpegsr8a.zip
- uncompress this zip-file
- then open an MSYS shell
./configure
make
make install-strip
This will build and install both the static library and the DLL as well.
Step 4) building libpng
libpng is a popular library supporting the PNG image compression.Depends on: libz
Required by: librasterlite
Building under Windows is absolutely a plain and easy task.
- download the latest sources: lpng143.zip
- uncompress this zip-file
- then open an MSYS shell
cp scripts/makefile.mingw .
now you have to manually edit the makefile.mingw file completing some variable defs as follows:
- DESTDIR=/usr/local
- ZLIBLIB=/usr/local/lib
- ZLIBINC=/usr/local/include
cp png.h pngconf.h /usr/local/include
cp libpng.a libpng.dll.a /usr/local/lib
cp libpng14.dll pngtest-stat.exe pngtest.exe /usr/local/bin
Important notice: the latest libpng-1.4.3 doesn't supports ./configure
So you have to apply the above instructions in order to build this library.
Step 5) building libtiff
libtiff is a popular library supporting the TIFF image format.Depends on: libz, libjpeg
Required by: librasterlite
Building under Windows is absolutely a plain and easy task.
- download the latest sources: tiff-3.9.4.zip
- uncompress this zip-file
- then open an MSYS shell
export "CFLAGS=-I/usr/local/include"
export "LDFLAGS=-L/usr/local/lib"
./configure
make
make install-strip
Important notice: you have to properly set the shell environment in order to retrieve the already installed libz; this is the duty of the two above export directives.
This will build and install both the static library and the DLL as well.
Step 6) building libproj
libproj is a library supporting coordinate's transformation between different Reference Systems [PROJ.4]Required by: libgeotiff, libspatialite, spatialite-tools
Building under Windows is an easy task.
- download the latest sources: proj-4.7.0.zip
- uncompress this zip-file
- then open an MSYS shell
./configure --without-mutex
make
make install-strip
Important notice: may well be you'll get the following fatal errors:
pj_mutex.c:167: error: redefinition of 'pj_acquire_lock' |
pj_mutex.c:65: error: previous definition of 'pj_acquire_lock' was here |
pj_mutex.c:181: error: redefinition of 'pj_release_lock' |
pj_mutex.c:75: error: previous definition of 'pj_release_lock' was here |
pj_mutex.c:192: error: redefinition of 'pj_cleanup_lock' |
pj_mutex.c:82: error: previous definition of 'pj_cleanup_lock' was here |
pj_mutex.c:206: error: redefinition of 'pj_init_lock' |
pj_mutex.c:91: error: previous definition of 'pj_init_lock' was here |
in such an evenience you have to edit the -/src/pj_mutex.c source as follows:
33c33 |
< #ifndef _WIN32 |
--- |
> #if defined (_WIN32) && !defined(__MINGW32__) |
40c40 |
< #ifndef _WIN32 |
--- |
> #if defined (_WIN32) && !defined(__MINGW32__) |
Step 7) building libgeotiff
libgeotiff is a library supporting the GeoTIFF raster formatDepends on: libz, libjpeg, libtiff, libproj
Required by: librasterlite
Building under Windows is an easy task.
- download the latest sources: libgeotiff130.zip
- uncompress this zip-file
- then open an MSYS shell
export "CFLAGS=-I/usr/local/include"
export "LDFLAGS=-L/usr/local/lib"
./configure --enable-incode-epsg
make
make install-strip
Important notice: it doesn't seem possible to build as a DLL using MinGW + MSYS. AFAIK, there is no way to do such a thing.
So you have to manually apply the following patch to circumvent this issue. Edit the /usr/local/lib/libgeotiff.la file as follows:
10c10 |
< library_names='' |
--- |
> library_names='libgeotiff.a' |
Step 8) building libgeos
libgeos is a library representing a C++ porting of JTS [Java Topology Suite].Required by: libspatialite, spatialite-tools
This library really is an huge and complex piece of software; building on Windows is an incredibly time consuming task, and may be quite complex.
- download the latest sources: geos-3.2.2.tar.bz2
- uncompress this zip-file
- then open an MSYS shell
./configure
make
make install-strip
This will build and install both the static library and the DLL as well.
Important notice: using standard MinGW you'll get the following fatal errors:
C:/MinGW/bin/../gcc/mingw32/3.4.5/http://www.cnblogs.com/http://www.cnblogs.com/include/c++/3.4.5/cwchar:161:
error: '::swprintf' has not been declared
C:/MinGW/bin/../gcc/mingw32/3.4.5/http://www.cnblogs.com/http://www.cnblogs.com/include/c++/3.4.5/cwchar:168:
error: '::vswprintf' has not been declared
This is because GEOS sets the -ansi switch, and MinGW support for strict ANSI mode is somehow broken.
Fixing this issue requires some little hacking:
- go to the C:\MinGW\include\c++\3.4.5 dir
- edit the cwchar file [as shown in the following table], save end exit
- after applying this patch, GEOS will build without any further problem.
line 160 | using ::putwchar; |
line 161 | // using ::swprintf; |
line 162 | using ::swscanf; |
line 163 | using ::ungetwc; |
line 164 | using ::vfwprintf; |
line 165 | #if _GLIBCXX_HAVE_VFWSCANF |
line 166 | using ::vfwscanf; |
line 167 | #endif |
line 168 | // using ::vswprintf; |
line 169 | #if _GLIBCXX_HAVE_VSWSCANF |
line 170 | using ::vswscanf; |
line 171 | #endif |
line 172 | using ::vwprintf; |
Step 9) building expat
expat is a well known standard library supporting XML parsing.Depends on: nothing
Required by: spatialite-tools
Building under Windows really is a piece-of-cake.
- download the latest sources: expat-2.0.1.tar.gz
- uncompress this tar.gz file
- then open an MSYS shell
./configure
make
make install
This will build and install both the static library and the DLL as well.
Step 10) building libspatialite
libspatialite is the main core of SpatiaLiteDepends on: libiconv, libproj, libgeos
Required by: spatialite-tools, librasterlite
Building under Windows is an easy task.
- download the latest sources: libspatialite-amalgamation-2.4.0.zip
- uncompress this zip-file
- then open an MSYS shell
export "CFLAGS=-I/usr/local/include"
export "LDFLAGS=-L/usr/local/lib"
./configure --target=mingw32
make
make install-strip
Step 11) building spatialite-tools
spatialite-tools the SpatiaLite command-line management toolsDepends on: libiconv, libproj, libgeos, libspatialite, expat
Building under Windows is an easy task.
- download the latest sources: spatialite-tools-2.4.0.zip
- uncompress this zip-file
- then open an MSYS shell
export "CFLAGS=-I/usr/local/include"
export "LDFLAGS=-L/usr/local/lib"
./configure --target=mingw32
make
make install-strip
This will build and install both the static library and the DLL as well.
Please note: following the above method you'll get dynamically linked tools [i.e. depending on DLLs].
If you whish instead to build statically linked tools [i.e. self contained, not depending on DLLs], now type:
mkdir static_bin
make -f Makefile-static-MinGW
cp static_bin/* /usr/local/lib
Step 12) building libgaiagraphics
libgaiagraphics is a common utility library supporting graphics rendenderingDepends on: libjpeg, libpng, libtiff, libgeotiff, libz
Required by: spatialite-gui [next-to-come releases of librasterlite and spatialite-gis]
Building under Windows is an easy task.
- download the latest sources: libgaiagraphics-0.1.zip
- uncompress this zip-file
- then open an MSYS shell
export "CFLAGS=-I/usr/local/include"
export "LDFLAGS=-L/usr/local/lib"
./configure
make
make install-strip
This will build and install both the static library and the DLL.
Step 13) building wxWidgets MSW
wxWidgets is a popular widgets library, supporting GUI in a cross-platform fashion; MSW is the specific porting supporting Windows.Required by: spatialite-gui, spatialite-gis
This library really is an huge and complex piece of software; building on Windows is an incredibly time consuming task, but is quite plain and easy.
- download the latest sources: wxMSW-2.8.11.zip
- uncompress this zip-file
- then open an MSYS shell
mkdir msw_build
cd msw_build
../configure --disable-shared --disable-debug \
--disable-threads --enable-monolithic --enable-unicode \
--without-libjpeg --without-libpng --without-zlib\
--without-libtiff --without-expat --without-regex
Please note: the wxMSW ./configure is highly configurable: you must apply exactly the above settings.
Anyway, when ./configure stops, it's a good practice to check if the final report looks exactly like this:
Configured wxWidgets 2.8.11 for `i686-pc-mingw32' Which GUI toolkit should wxWidgets use? msw Should wxWidgets be compiled into single library? yes Should wxWidgets be compiled in debug mode? no Should wxWidgets be linked as a shared library? no Should wxWidgets be compiled in Unicode mode? yes What level of wxWidgets compatibility should be enabled? wxWidgets 2.4 no wxWidgets 2.6 yes Which libraries should wxWidgets use? jpeg builtin png builtin regex builtin tiff builtin zlib builtin odbc no expat builtin libmspack no sdl no |
now, when ./configure stops, you have to continue as usual:
make
make install-strip
Step 14) building libharu
libharu is an interesting and innovative library supporting generation of PDF documents.Depends on: libz, libpng
Required by: spatialite-gis
Building under Windows is an easy task.
- download the latest sources: libharu-2.1.0.tar.gz
- uncompress this tar.gz file
- then open an MSYS shell
export "CFLAGS=-I/usr/local/include"
export "LDFLAGS=-L/usr/local/lib"
./configure
make
make install-strip
Important notice: it doesn't seem possible to build as a DLL using MinGW + MSYS. AFAIK, there is no way to do such a thing.