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環境を構築する。
Makefile.amとconfigure.acを作る。
$ []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[]
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