Building Qt Jambi on Windows using MinGW

General

The following howto describes the steps neccessary to compile Qt Jambi on Windows using the MinGW development environment. It was tested on a 32bit Windows 7 installation. If you encounter any problems following it you are encouraged to seek help in the #qtjambi channel on freenode.

Prerequisites:

Note about current releases:
Current Qt releases are compiled using MinGW version 4.4, while the current official version of MinGW from http://www.mingw.org/ [mingw.org] is 4.5. Issues may arise if you try to run applications which were compiled against MinGW-4.5 with a Qt library compiled against MinGW-4.4.
Unless you have access to a MinGW version known to work with the official Qt binaries, you are encouraged to build your own Qt binaries from source. If you want to stick to the official Qt binaries you may try the MinGW-4.4 binaries provided by msysgit [code.google.com] or those shipped with the Qt SDK releases.

  • MinGW: You can download MinGW from http://www.mingw.org [mingw.org]. Follow the installation instructions there. In the rest of this howto we will assume that you have installed MinGW to C:\MinGW. If you chose a different installation destination configure your PATH accordingly in the section Adjust your CMD environment below.
  • Git (optional): You need that if you want to fetch the Qtjambi sources via git. The easiest way to achieve that is by installing Msysgit which can be downloaded from http://code.google.com/p/msysgit [code.google.com].
  • Qt: You can download Qt here: http://qt.nokia.com/ [qt.nokia.com]. The version of Qt used for this howto is Qt-4.7.1. You may have to change your PATH settings below if you chose a different version or installed it to another destination.
  • Qtjambi: Last but not least, you of course need Qtjambi itself. You have to fetch it from http://qt.gitorious.org/qt-jambi [qt.gitorious.org]. Make sure you use the latest community version, not the official version which is hopelessly outdated and not maintained anymore. You need git to fetch it: You can use msysgit [code.google.com] for it. Alternatively you can just take a source package from our website, if currently available.

Executing git clone git://gitorious.org/qt-jambi/qtjambi-4_7.git qtjambi will fetch the current development version of qtjambi into a directory called qtjambi. Now change into that directory and start with adjusting the environment.

Compile own Qt with MinGW and MSYS

1. Get Qt sources from git repo or their site
2. Open MSYS console
3. Go to extracted Qt source directory and run ./configure.exe with arguments you want (TODO: proper argument listing) Important note: Do not use ./configure, it fails with MSYS. You may also need to use

  1. -platform win32-g++

4. exec “make” or “mingw32-make”, which one ever is available
5. Go to eat something.

Adjust the build properties

In the root directory of Qtjambi there are two files named build.properties and buildpath.properties respectively. These two files represent the build configuration used by ant to build Qtjambi. In order for Qtjambi to compile on windows, we have to change a few settings in buildpath.properties since the default settings are geared towards compilation on linux. You have to comment in or delete (thereby effectively deactivating) the entries qtjambi.java.library.path and all those starting with qtjambi.phonon.. It is also safe to do the same to those entries describing the location of the Qt library. Those start with qt. (eg.: qt.bindir, qt.libdir). The resulting buildpath.properties configuration file – stripped of all comment lines – may look like this:

  1. timestamp.dir                   = build/timestamps
  2. java.srcdir                     = src/java
  3. java.outdir                     = build/java/out
  4. jardir                          = jars
  5. generator.outputdir             = build/generator/out
  6. generator.xmlmerge.srcdir       = generator/typesystem/xml
  7. generator.xmlmerge.outputdir    = build/generator
  8. juic.outputdir                  = build/juic/out

Adjust your CMD environment:

You have to at least set the QTDIR and JDK_HOME variables to point to your Qt and JDK installation respectively. The compiler suit shipped with MinGW must be in PATH so ant can find and run it. Also make sure the ant binary is in PATH or else you have to use the full path to the ant binaries in order to execute the ant command.

Below we assume that Qt is installed to C:\Qt\4.7.1, The Java JDK can be found in C:\Program Files\Java\jdk1.6.0_23 and ant has been installed to C:\Program Files\ant\ while mingw can be found in C:\MinGW (That’s the default installation path if you installed Mingw using msysgit: http://code.google.com/p/msysgit/).

The commands to set up the environment may (depending on your installation paths) look like this:

  1. set "JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_23"
  2. set "MINGW=C:\MinGW"
  3. set "ANT=C:\Program Files\ant"
  4. set "QTDIR=C:\Qt\4.7.1"
  5. set "PATH=%JAVA_HOME%\bin;%ANT%\bin;%QTDIR%\bin;%MINGW%\bin;%PATH%"

Clean Qtjambi from (possibly) existing build files

It is best to clean the root directory of qtjambi from old build-files by calling ant clean or ant distclean to have a fresh start:

  1. ant clean

Compile Qtjambi

Now start the compilation of qtjambi with the following command:

  1. ant all

Alternatively you can use the following batch script that takes care of all this (except cleaning the build directory):

Save the script content below to a file called compile-qtjambi-win32.bat:

  1. @echo off
  2.  
  3. setlocal EnableDelayedExpansion
  4.  
  5. REM Setting environment variables
  6. set "LC_ALL=C"
  7. if not defined JAVA_HOME (set "JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_23")
  8. if not defined MINGW     (set "MINGW=C:\MinGW")
  9. if not defined ANT       (set "ANT=C:\Program Files\ant")
  10. if not defined QTDIR     (set "QTDIR=C:\Qt\4.7.1")
  11. set "PATH=%JAVA_HOME%\bin;%ANT%\bin;%QTDIR%\bin;%MINGW%\bin;%PATH%"
  12.  
  13. REM Starting the compilation process
  14. echo "COMPILING QTJAMBI"
  15. ant %1
  16.  
  17. endlocal

This way you only have to call compile-qtjambi-win32.bat <argument> where <target> can be any of the ant targets defined for this project. The script can basically be regarded an alias for ant with some environment variables set. You use it as you would use ant. For example, in order to compile Qtjambi you would execute:

  1. compile-win32.bat all

To see a list of supported targets use:

  1. compile-win32.bat -projecthelp

Note however that the script must be placed into the root directory of Qtjambi and also be executed from within that very directory.

If the compilation is successfull you will see a line similar to this:

  1. BUILD SUCCESSFUL
  2. Total time: 61 minutes 8 seconds

Launching Qtjambi demo

In order to launch Qtjambi you have to set the CLASSPATH and run qtjambi like this from the Qtjambis root directory:

  1. java -cp build\qtjambi-win32-mingw-4.7.1.jar;^
  2. qtjambi-4.7.1.jar;^
  3. qtjambi-examples-4.7.1.jar com.trolltech.launcher.Launcher

Note that the symbol ^ in batch scripts or in the command console on windows is used to break up long commands into several lines. You could have just as well put the entire command into a single line. We broke it up here to make it more readable.

Troubleshooting

Can’t compile Qt Jambi

If your Qt libraries are not compiled against MinGW 4.5 you won’t be able to build Qt Jambi using that version of MinGW. The standard Qt-4.7.x binaries provided by Nokia are compiled against MinGW 4.4 so you need to use that version of MinGW to compile Qtjambi. If you want to stick to your bleeding edge version of MinGW you have to compile Qt yourself using MinGW 4.5.

Can’t load Qt Jambi examples

It might happen that loading the demo app shipped with Qt Jambi fails with the following error:

  1. Loading library: 'QtCore4.dll'...
  2.  - using deployment spec
  3.  
  4.         at com.trolltech.qt.internal.NativeLibraryManager.loadNativeLibrary(Unknown Source)
  5.         at com.trolltech.qt.internal.NativeLibraryManager.loadQtLibrary(Unknown Source)
  6.         at com.trolltech.qt.Utilities.loadQtLibrary(Unknown Source)
  7.         at com.trolltech.qt.Utilities.loadQtLibrary(Unknown Source)
  8.         at com.trolltech.qt.QtJambi_LibraryInitializer.<clinit>(Unknown Source)
  9.         ... 1 more
  10. Caused by: java.lang.UnsatisfiedLinkError: C:\..\QtJambi_x86_4.7.1_mingw-[stamp]\lib\QtCore4.dll:
  11. Can't find dependent libraries
  12.        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
  13.        at java.lang.ClassLoader.loadLibrary0(Unknown Source)
  14.        at java.lang.ClassLoader.loadLibrary(Unknown Source)
  15.        at java.lang.Runtime.load0(Unknown Source)
  16.        at java.lang.Runtime.load(Unknown Source)
  17.        at com.trolltech.qt.internal.NativeLibraryManager.loadLibrary_helper(Unknown Source)
  18.        ... 6 more
  19. Could not find the main class: com.trolltech.launcher.Launcher.  Program will exit.

This means it fails to load two vital dlls from one of the jar files listed above. This is a known bug which has already been fixed in the git repository. If you use an older version you have to workaround it by adding the location of those libs to PATH. Qt and mingw both ship those files. If you want to use the ones shipped with Qt you would have to adjust your path like so assuming Qt was installed to C:\Qt\4.7.1:

  1. set PATH=C:\Qt\4.7.1\bin;%PATH%

Now launching the qtjambi demo should work as expected.

Categories: