Re: [xml] compile libxml2.7.8 under cygwin&Win7 with mingw toolchain

lin hong wrote:
Hi, all

we are making a release of our software with libxml under windows. we
up compiling it from source code, I thought it might worth writing it

first thing is, if you don't care about dependency of cygwin libraries
(which means the program require cygwin installed to run), just get
through cygwin setup. For us, it's not fair to ask normal user to
cygwin, so we try binary first.

I'm more comfortable with MSYS.

most work we did are under mac/linux, but for windows release, we are
using cygwin. is MSYS better than cygwin? I'm not familiar with windows at

we got the binary from

but it does not work on cygwin + Win7 , just try to run any exe file
/bin dir, we got this.

/usr/i686-pc-mingw32/xslt_xml2/bin/xsltproc.exe: error while loading
shared libraries: ?: cannot open shared object file: No such file or

Where do the .dll live?  In /usr/i686-pc-mingw32/xslt_xml2/bin?  If not,
you'll need to add the path to the dll to PATH or move the dll to this
xslt_xml2/bin directory.

what ".dll" files do we need to move under /bin ?

I believe it works for WinXP because I saw the msg on the website:
"The binaries are supported on an operating system based on the
such as Windows NT, Windows 2000 and Windows XP, exclusively"

also it seems require iconv, which we don't really need.

libxslt requires it.

we did compile libxslt later without iconv -- at least I thought it works.
maybe we are missing some part of function.

anyway, we decide to compile it ourselves,  here are the changes I did:

You'll need the patches I just submitted to this list.

0. for windows, makefile and configure are under /win32, run configure
like Readme.txt sugguests:

I believe you'll need to specify the --host switch if you're using Cygwin.

cscript configure.js threads:no static:yes compiler:mingw iconv:no
prefix=where_you_want_to_install   include=where_your_mingw_include_is
lib=where_your_mingw_lib_is debug=yes

1. We are using mingw , so Makefile.mingw is the one for us. modify

With MSYS I just use configure to create the Makefile.

1.1 We want the program be independent from cygwin library, add
"-mno-cygwin" to CC
! CC = gcc.exe -mno-cygwin

The -mno-cygwin switch is dead.  Cygwin now uses a cross build concept
instead of a bastardized separation of MinGW gcc and Cygwin gcc.  This
is the reason you'll need to specify the --host if you Cygwin to
configure it.

really? we are using cygwin1.7.9(0.237/5/3).  is the "--host" option for
cygwin or just for libxml?
if the "--host" option can take care of MingGW/Cygwin choice problem, it
would be great.

1.2 Want more output during compiling? add "-v"

I don't know about these defines, I did not have to do that.

"-v" is just verbose option. it's not necessary. other options are default
by the makefile.

1.3 The default gcc linker refuse to look into Mingw directory before
Cygwin directory, I don't know why, so I use flexlink instead, modify

Again you need to add --host to the configure.

LD = flexlink
also add flags flexlink needs:
+ #flexlink flag
+ FL_LDFLAGS = -chain mingw

I don't have any idea what flexlink is.

flexlink is linker that manage symbols for windows dll. make lift easier
for windows rookie like me, you can download it from

1.4 Then call our LD with its flags to make "dll"
# Creates the libxml shared object.
! #XMLSO_LDFLAGS = $(LDFLAGS) -shared -Wl,--dll

Configure with --disable-static --enable-shared or vice versa.

I thought we need to set "static=1", so here we should do --enable-static
& --disable-shared?

1.5 Make ".a" , there is a typo in the original makefile, they mess up
"/" with "\" -- you will get a "bin.mingwlibxml2.a" instead of
"bin.mingw/libxml2.a" because of this.
 # Creates the libxml archive.

The Makefile.mingw is probably constructed to be used with mingw32-make
which can handle the \ in paths but lacks in other things.

where is "mingw32-make"?

1.6 Make sure STATIC is set to 1 in config.mingw -- if you did configure
with "static:yes", you are good. Add "-exe" to flexlink so it will
executable instead of dll file.
! # An implicit rule for xmllint and friends.
! # STATIC=1 is set in config.mingw
! # I also change XML_BASENAME to XML_NAME.(-llibxml2 to -lxml2)
  ifeq ($(STATIC),1)
  $(BINDIR)/%.exe : $(UTILS_SRCDIR)/%.c
   $(CC) -DLIBXML_STATIC $(CFLAGS) -o $(subst
-c $<
!  # $(LD) $(LDFLAGS) -o $@ $(subst .c,.o,$(UTILS_INTDIR)/$(<F))
!  $(LD) $(FL_LDFLAGS) -exe -o $@ $(subst .c,.o,$(UTILS_INTDIR)/$(<F))

That's pretty much everything for makefile.

3. so far everything we did so far is under win32, config.h in the upper
dir needs to be changed

in config.h, find these two undef

   /* Determine what socket length (socklen_t) data type is */
   #undef XML_SOCKLEN_T
   /* Define to 1 if you have the <stdint.h> header file. */
   #undef HAVE_STDINT_H

Define them

Without stdint.h you will get error message like "uint32 undefined".

4. set flag C_INCLUDE_PATH.
Set c_include_path flag can fix the "could not find libxml/xxx.h"
Head files are under /libxml2-2.7.8/include and
to make our gcc look into these directories, we need to point
C_INCLUDE_PATH to them,  just setting C_FLAGS is NOT enough -- that's
really really strange.
although later I found out /libxml2-2.7.8/libxml/ also have a set of all
head files, so maybe pointing C_INCLUDE_PATH to that is also ok.

OK,  take a breath and run

make -f Makefile.mingw

that's it.

Without my patch xmlcatalog will fail to read the entries in the catalog
if you use GCC-4.6.1.

All I needed to do with MinGW + MSYS otherwise was

cd libxml2-2.7.8
mkdir bld
cd bld
../configure --prefix=/mingw --without-python --enable-shared
make install

I've also built it with the python bindings but you must ensure that
your environment is set up with PYTHON variables.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]