Fedora 10上でMinGWを使ってクロスコンパイル

表題のような記事を書こうとしたがすでに先人がおりあまり書くことが無い。以下に重要なページのリンクを上げておく。
MinGW | Minimalist GNU for Windows
MinGW(Wikipedia)
Fedora MinGW project

MinGW: Compile software for Windows without leaving your Fedora machine
Fedora 10で「virt-viewer」をクロスコンパイルする実例。
bitWalk'sの「MinGW クロスコンパイラ」の項目
すぐりふひと氏のブログ。MinGWに関して日本語で非常に多くの記事を書いておられる。
MinGW Cross Compiler Project
同氏によるFedora10用コンパイル済みバイナリが多数置いてある。
Cross-compiling GTK+ apps for Windows
Ubuntu 7.10での環境構築の方法ほか。
GTK+ - Download for Windows
GTK+アプリをビルドするのに必要なファイル群。


ロスコンパイルの実例としてGlibのGRegexを使用した以下のようなプログラムをコンパイルして動作確認してみた。

gregex.c:

#include <stdio.h>

#include <glib.h>
#include <glib/gprintf.h>

int main(int argc, char *argv[])
{

  if (argc == 1)
    return 0;
  int i = 0;
  gint ret;
  gchar *string = NULL;
  GError *error = NULL;
  GMatchInfo *info = NULL;
  const gchar *pat = "[(][ ]*(\\d+)[ ]*ms[ ]*[)]";
  GRegex *reg = g_regex_new (pat,
                             G_REGEX_CASELESS | G_REGEX_OPTIMIZE,
                             0, /* match flag */
                             &error);
  if (error)
  {
    g_error_free (error);
    return 1;
  }
  for (i = 1; i < argc; ++i)
  {
    if (g_regex_match (reg, argv[i], 0, &info))
    {
      string = g_match_info_fetch (info, 1);
      ret = g_ascii_strtod (string, NULL);
      g_free (string);
      g_match_info_free (info);
      g_fprintf (stdout, "%d\n", ret);
    }
  }
  g_regex_unref (reg);
  return 0;
}

MinGW環境を構築する。


$ []sudo yum install mingw32-binutils mingw32-gcc mingw32-w32api mingw32-runtime[]
[]...省略...[]
[]Installed:[]
[] mingw32-binutils.i386 0:2.19-2.fc10 mingw32-gcc.i386 0:4.3.2-12.fc10 []
[] mingw32-runtime.noarch 0:3.15.1-10.fc10 mingw32-w32api.noarch 0:3.12-8.fc10 []

[]Dependency Installed:[]
[] mingw32-cpp.i386 0:4.3.2-12.fc10 mingw32-filesystem.noarch 0:40-3.fc10 []

Complete!
$ []wget 'http://nchc.dl.sourceforge.net/sourceforge/mingw-cross/mingw32-glib2-2.18.1-2.zip'[]
$ []unzip mingw32-glib2-2.18.1-2.zip[]
[]Archive: mingw32-glib2-2.18.1-2.zip[]
[] creating: mingw32-glib2-2.18.1-2/[]
[]...省略...[]
$ []sudo mv mingw32-glib2-2.18.1-2/* /usr/i686-pc-mingw32/[]
$ []rmdir mingw32-glib2-2.18.1-2[]
$ []sed -i 's@^prefix=.*$@prefix=/usr/i686-pc-mingw32@g' lib/pkgconfig/*.pc[]

Makefile.amとconfigure.acを作る。
configure.ac:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.63])
AC_INIT([gregex], [0.1], [***@********])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([gregex.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.
PKG_CHECK_MODULES([GREG], [glib-2.0 >= 2.14 ])
AC_SUBST([GREG_CFLAGS])
AC_SUBST([GREG_LIBS])

# Checks for header files.
AC_HEADER_STDC

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.am:

bin_PROGRAMS = gregex
gregex_SOURCES = gregex.c
gregex_LDADD = @GREG_LIBS@
AM_CFLAGS = @GREG_CFLAGS@

ビルドとWineを使った動作確認。


$ []autoheader && aclocal && autoconf -i && automake -a -c[]
[]...省略...[]
$ []./configure --host=i686-pc-mingw32[]
[]...省略...[]
$ []make[]
[]make all-am[]
[]make[1]: ディレクトリ `/home/tks/unix/gregex' に入ります[]
i686-pc-mingw32-gcc -DHAVE_CONFIG_H -I. -mms-bitfields -I/usr/i686-pc-mingw32/include/glib-2.0 -I/usr/i686-pc-mingw32/lib/glib-2.0/include -g -O2 -MT gregex.o -MD -MP -MF .deps/gregex.Tpo -c -o gregex.o gregex.c
[]mv -f .deps/gregex.Tpo .deps/gregex.Po[]
[]i686-pc-mingw32-gcc -mms-bitfields -I/usr/i686-pc-mingw32/include/glib-2.0 -I/usr/i686-pc-mingw32/lib/glib-2.0/include -g -O2 -o gregex.exe gregex.o -L/usr/i686-pc-mingw32/lib -lglib-2.0 -lintl []
make[1]: ディレクトリ `/home/tks/unix/gregex' から出ます
$ []wine gregex.exe '(59ms)'[]
[]err:module:import_dll Library libglib-2.0-0.dll (which is needed by L"Z:\\home\\tks\\unix\\gregex\\gregex.exe") not found[]
[]err:module:LdrInitializeThunk Main exe initialization for L"Z:\\home\\tks\\unix\\gregex\\gregex.exe" failed, status c0000135[]
$ []cp /usr/i686-pc-mingw32/bin/libglib-2.0-0.dll .[]
$ []wine gregex.exe '(59ms)'[]
59