Linux 上で Windows のモジュールをコンパイルする方法は Google 先生に聞くと結構出てくるけど、その逆がなかなか出てこない。
ということで Windows 上で Linux のモジュールをコンパイルする方法をメモ。
Cygwin か MinGW/msys ということになると思う。導入に関する詳細は下記ページで。
ここでは Cygwin を使ってみる。
理屈としては、ターゲットとなる Linux の C++ 環境をターゲットとして、Cygwin で gcc をコンパイルすれば良いということになる。
と思ったけど、上手くいかないので、とりあえず以下のサイトからコンパイル済みのクロスコンパイラをいただいて使用することにする。
上記サイトの クロスコンパイラ をいただく。
実は、私もやろうとしたけど、挫折した。
一応、こうすればできるらしいということを、今後の為にメモしておく。
$ mkdir /tmp/linux-runtime
$ cp -r /lib /tmp/linux-runtime $ cp -r /usr/lib /tmp/linux-runtime $ cp -r /usr/include /tmp/linux-runtime
$ tar zxvf binutils-2.19.tar.gz $ tar zxvf gcc-3.3.4.tar.gz
$ mkdir /usr/local/linux
$ mv -R (どこか)/linux-runtime /usr/local/linux $ ls /usr/local/linux lib include
/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )↓
/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ GROUP ( /usr/local/linux/lib/libc.so.6 /usr/local/linux/lib/libc_nonshared.a )
$ cd /home/user/work/binutils-2.19 $ mkdir build $ cd build $ ../configure --prefix=/usr/local/linux \ --target=i686-linux \ --host=i686-pc-cygwin \ --build=i686-pc-cygwin (略) $ make $ make install
$ PATH=/usr/local/linux/bin:$PATH
$ cd /home/user/work/binutils-2.19 $ mkdir build $ cd build $ ../configure --prefix=/usr/local/linux \ --target=i686-linux \ --host=i686-pc-cygwin \ --build=i686-pc-cygwin \ --enable-languages=c,c++ \ --enable-shared \ --enable-threads \ --includedir=/usr/local/linux/include (略) $ make $ make install※ オプション不要なものや足りないものがあるかもしれない。
/usr/local/linux/bin /usr/local/linux/include /usr/local/linux/lib /usr/local/linux/man /usr/local/linux/share
i686-linux-as i686-linux-gcc i686-linux-g++
$ i686-linux-gcc hello.c -o helloこれで hello が出力される。が、Windows 上では実行できない。
となるはずが、私は上手くいかない。何か手順が足りないんだと思うけど。。
Cygwin 環境で、以下の構成になっているとする。
Eclipse は CDT を使う。
日本語化する(英語のままでも良いならここは不要)。ただ、下の説明は日本語化を前提に書いてるので、英語のままの場合は読み替えてネ。
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
$ ./hello