クロス開発環境(linuxでwindows用プログラムを開発)


（おことわり）
ubuntuにてwxWidgetを用いたGUIプログラムを開発していた時に、windows用アプリもあわせて開発できる環境を整えたときのメモです。かなり昔にGoogle Sitesに書いた記事で、内容が陳腐化していますが消えてしまうのも忍びないので転載しました。転載時(2020/8)には再検証していません。

##コンパイラと実行環境のインストール
###１）gcc cross-compiler packageをインストール
まず、linuxでwindows用のプログラムを作成するコンパイラ（クロスコンパイラ）をインストールします。

インストールするパッケージ

- mingw-w64 
windowsでの動作に必要な基本的な部品を集めたライブラリ
- gcc-mingw-w64
このmingwを使う前提で64bitOS対応のコードを作成するCコンパイラ
- g++-mingw-w64
同C++のコンパイラ

```shell:
$ sudo apt-get install mingw-w64 binutils-mingw-w64 gcc-mingw-w64 g++-mingw-w64
```

gcc-mingwで作成した実行ファイル（プログラム）は、（一般に）それだけでは動作しません。コンパイルして出来上がった実行ファイルとmingwのランタイムライブラリの２つが必要です。普通のWindowsユーザはmingwのランタイムライブラリを持っていませんから、コンパイルしたプログラムとmingwライブラリを一緒に配布する必要があります。

mingwのライブラリはmingw32-runtime-packageに含まれているので、これをカレントディレクトリにコピーして、一緒に配布できるようにしましょう。

```bash:runtime
$ cp /usr/share/doc/mingw32-runtime/mingwm10.dll.gz .
$ gunzip mingw10.dll
```

###２）linux環境でwindows用プログラムのテスト環境をつくる
windows用のプログラムをlinuxで動作させるには、windowsの代行をするプログラムが必要

```bash:install_wine
$ sudo apt-get install wine
```

###3)サンプルプログラムでテスト

```cpp:hello.cpp
#include <iostream>
int main(int ac,char*av[]){
    std::cout<<"hello"<<std::endl;
    return 0;
}
```

```bash:test
$  i686-w64-mingw32-g++ -static-libgcc -static-libstdc++  hello.cpp 
```

###４）環境変数をセットする

```bash:setenv4cross.sh
export CC=i686-w64-mingw32-gcc
export CXX=i686-w64-mingw32-c++
export LD=i686-w64-mingw32-ld
export AR=i686-w64-mingw32-ar
export AS=i686-w64-mingw32-as
export NM=i686-w64-mingw32-nm
export STRIP=i686-w64-mingw32-strip
export RANLIB=i686-w64-mingw32-ranlib
export DLLTOOL=i686-w64-mingw32-dlltool
export OBJDUMP=i686-w64-mingw32-objdump
export RESCOMP=i686-w64-mingw32-windres
export WINDRES=i686-w64-mingw32-windres
```

```bash:set
$ source setenv4cross.sh
```

###マルチスレッド用のヘッダとライブラリをインストールする

pthread （いまは、pthreadを別途インストールする必要はないかも)
 
http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/pthreads-w32-2.9.1/

<!--
- http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/pthreads-w32-2.9.0-pre-20110507-2/pthreads-w32-2.9.0-mingw32-pre-20110507-2-src.tar.lzma/download
- http://sourceforge.net/projects/mingw/files/MinGW/pthreads-w32/pthreads-w32-2.9.0-pre-20110507-2/ -->

から

```bash:install_pthread
$ export SANDBOX=~/src/cross
$ mkdir pthread
$ tar xvf pthreads-w32-2.9.0-mingw32-pre-20110507-2-src.tar.lzma --lzma

# $ pkgbuild -e prep
# $ pkgbuild -e patch
# $ pkgbuild -e configure

$ cd pthreads

$ make CROSS=i686-w64-mingw32- clean GC-inlined -f GNUmakefile

$ mkdir -p $SANDBOX/{include,lib,bin}
$ cp libpthreadGC2.a $SANDBOX/lib/
$ cp *.h $SANDBOX/include/
$ cp pthreadGC2.dll $SANDBOX/bin/
```

##クロスコンパイル用の wxWidgetsの作成(お好みで)
Compile and install
disable-sharedなどは好みに応じて。

```bash:install wxWidgets
$ tar xjf wxWidgets-2.8.12.tar.bz
$ cd wxWidget-2.8.12
$ ./configure --prefix=/usr/local/i586-mingw32 --host=i586-mingw32msvc --enable-unicode --build=`./config.guess` --disable-shared
$ make
$ sudo make install
```

###Test sample
ランタイムライブラリへのリンクを作るのを忘れないように。

```
$ cd samples
$ cd (試したいもの)
$ make
$ ln -s $SANDBOX/mingw10.dll .
(実行）
$ make clean
```

###wxWidgetsを用いたソースのコンパイル方法
基本的にcross compile用にinstallしたwx-configを使えばOKです。

```Makefile
MINGW_PREFIX=i586-mingw32msvc
CXX=$(MINGW_PREFIX)-g++
LD=$(MINGW_PREFIX)-ld
WXCONFIG=/usr/local/i586-mingw32/bin/wx-config
WXCPPFLAGS=`$(WXCONFIG) --cppflags`
WXLIBS=`$(WXCONFIG) --libs`
t.exe: t.cpp
    $(CXX) $(WXCPPFLAGS) $(CPPFLAGS) -o t.exe t.cpp $(WXLIBS)
```

##参考文献
 
- http://wiki.wxwidgets.org/Install_The_Mingw_Cross-Compiler
- http://clam-project.org/wiki/Devel/Windows_MinGW_cross_compile

検索キーワード：ubuntu, mingw, wine, cross complier, setup