なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

MinGW64環境の構築手順2

再びtdm-gccのMinGW64環境を作成してみた

1.tdm64-gcc-4.7.3 の導入

ダウンロード先は以下
TDM-GCC : Download
Bundle Installerで64bit用の環境をダウンロード。
GCC-4.8だといろんなものがビルドできないので4.7の最終版で。
とりあえずtdm-gccでc:/MinGW64に64bit環境をインストール。
その後、以下からMinGWインストーラーをダウンロードして
msys環境を足す。
MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net

ポイント

  • GUIの設定画面でMinGWのホームをC:\MinGW64に設定する
  • MinGW側のツールはtdm-gccのものがあるので何もインストールせず、msys-baseやmsysのdevelopper向けツールをダウンロードして設定する
  • ・あくまでmsysはi386環境のUNIX環境もどきなのでコンパイル時はビルドしているマシンはi386、ビルドのターゲットはx86_64という考え

2.各ライブラリのビルド

いろいろなサイトを参考にした

特に、下記のGaia-SINSのサイトは非常にお世話になった
Gaia-SINSというソフトウェア自体は、地図と情報をSQLによって管理するツールのようだが、MSW版のバイナリを配布するためにMinGW + msys + wxWidgets + libcurl、その他もろもろのオープンソースのライブラリを使用している。

本家サイト
The Gaia-SINS federated project home-page
MinGW64について
MinGW 64 how-to
http://go.kblog.us/2009/07/mingw-to-build-curl-for-windows.html

1. zlib-1.2.8

$ wget http://zlib.net/zlib-1.2.8.tar.gz
$ tar xvf zlib-1.2.8.tar.gz
$ cd zlib-1.2.8
$ make -f win32/Makefile.gcc CC=x86_64-w64-mingw32-gcc
$ make -f win32/Makefile.gcc install BINARY_PATH=/mingw/bin INCLUDE_PATH=/mingw/include LIBRARY_PATH=/mingw/lib SHARED_MODE=1

2.libxml2-2.9.0

makeの前に下記のサイトを参考にしてソースを修正する
Re: [xml] undefined reference to `_imp__xmlFree' error on mingw with msy

$ wget ftp://xmlsoft.org/libxml2/libxml2-2.9.0.tar.gz
$ tar xvf libxml2-2.9.0.tar.gz
$ cd libxml2-2.9.0
$ ./configure --prefix=/mingw --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 \
  --target=x86_64-w64-mingw32 --enable-shared --with-threads=no  CFLAGS=-O2
$ make && make install

3.openssl-1.0.0d

makeの前にMakefile中の'CC'と'MAKEDEPPROG'をx86_64-w64-mingw32-gccに設定しておく

$ wget http://www.openssl.org/source/openssl-1.0.1d.tar.gz
$ tar xvf openssl-1.0.1d.tar.gz
$ cd openssl-1.0.1d
$ ./Configure -DHAVE_STRUCT_TIMESPEC -L/mingw/lib -lz -lws2_32 --prefix=/mingw zlib mingw64 shared no-asm
$ make && make install

4.curl-7.30.0

curlをMinGW64でビルドするとver.7.30だけが唯一無事にビルドできる。
それ以降のバージョンだとソースの改修が入っていてどうにもならない。

    • host=<...>にはi686-w64-mingw32を設定する。

curlのconfigureはわりと細かいところまで設定を見ているのでこうしないとconftestに通らない。
また、--build/--targetは自動判別されるため、設定する必要はない。設定するとなぜかDLLがビルドされていなくて頭抱えてた。

$ wget http://curl.haxx.se/download/curl-7.30.0.tar.bz2
$ tar xvf curl-7.30.0.tar.bz2
$ ./configure --prefix=/mingw --host=x86_64-w64-mingw32 \
  --enable-shared --disable-debug

5.wxWidgets-3.0.0

ビルドする場所を綺麗に保つには、GitHubとconfigureの別場所ビルドを使用すると良い。
また、C++11は-std=gnu++11を指定すると良い。

$ cd /usr/local/src
$ git clone https://github.com/wxWidgets/wxWidgets.git
$ cd wxWidgets
$ git checkout WX_3_0_0
$ cd ../ && mkdir wxWidgets-3.0.0
$ cd wxWidgets-3.0.0
$ ../wxWidgets/configure --prefix=/mingw \
--host=x86_64-w64-mingw32 --enable-unicode --disable-debug CXXFLAGS='-std=gnu++11'

3.ビルドできない時のお助け

Cプリプロセッサコンパイルされたルートがさっぱどわがんねとき

 #error  "こうすると、この部分が定義された瞬間にコンパイルエラー"
 #waring "こうすると、この部分が定義されるとログを出力"

ビルドしたのにundefined referenceになるときに、オブジェクトファイルのシンボルを見る

 $ objdump -S <object-file>
 $ readelf -s <object-file>