LoginSignup
3
7

More than 3 years have passed since last update.

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

Posted at

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

コンパイラと実行環境のインストール

1)gcc cross-compiler packageをインストール

まず、linuxでwindows用のプログラムを作成するコンパイラ(クロスコンパイラ)をインストールします。

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

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

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

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

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

2)linux環境でwindows用プログラムのテスト環境をつくる

windows用のプログラムをlinuxで動作させるには、windowsの代行をするプログラムが必要

install_wine
$ sudo apt-get install wine

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

hello.cpp
#include <iostream>
int main(int ac,char*av[]){
    std::cout<<"hello"<<std::endl;
    return 0;
}
test
$  i686-w64-mingw32-g++ -static-libgcc -static-libstdc++  hello.cpp 

4)環境変数をセットする

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
set
$ source setenv4cross.sh

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

pthread (いまは、pthreadを別途インストールする必要はないかも)

から

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です。

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)

参考文献

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

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7