Linux 上で Windows のモジュールをコンパイルする方法は Google 先生に聞くと結構出てくるけど、その逆がなかなか出てこない。 ということで Windows 上で Linux のモジュールをコンパイルする方法をメモ。 #contents * Windows 上に UNIX 環境を構築 [#b84e6734] Cygwin か MinGW/msys ということになると思う。導入に関する詳細は下記ページで。 - [[UNIX on Windows]] ここでは Cygwin を使ってみる。 * クロスコンパイラの作成 [#kb724182] 理屈としては、ターゲットとなる Linux の C++ 環境をターゲットとして、Cygwin で gcc をコンパイルすれば良いということになる。 と思ったけど、上手くいかないので、とりあえず以下のサイトからコンパイル済みのクロスコンパイラをいただいて使用することにする。 - [[NEC の SDDSE 紹介サイト:http://www.nec.co.jp/cced/SDDSE]] -- [[サンプルダウンロード:http://www.nec.co.jp/cced/SDDSE/sampledl.html]] 上記サイトの クロスコンパイラ をいただく。 *** クロスコンパイラを自前でつくる場合 [#jb8fc3e2] 実は、私もやろうとしたけど、挫折した。 一応、こうすればできるらしいということを、今後の為にメモしておく。 + まず、ターゲットとなる Linux 上で、作業用のディレクトリをつくる。 -- ここでは /tmp/linux-runtime とする。&br; $ mkdir /tmp/linux-runtime + C/C++ コンパイルに必要なライブラリ(依存関係も全て)をコピーする。 -- これが、どれが必要なのかよくわからないので、以下のディレクトリを全部コピー。&br; $ cp -r /lib /tmp/linux-runtime $ cp -r /usr/lib /tmp/linux-runtime $ cp -r /usr/include /tmp/linux-runtime -- 環境によっては 500MB 超える。1GB くらいになることも。 -- あからさまに C/C++ に関係ないディレクトリは削除しても良いと思う。&br; python とか mozilla とか。 + linux-runtime を samba か scp か何かで Windows へ送る。 -- サイズが結構あるので、tar.gz とか lzma あたりで固めて移動すると良いかも。 + ここから Windows 側の作業。Cygwin はインストール済みという前提で。 -- Cygwin は C:\Cygwin にインストールされているとする。 + GNU の binutils と gcc のソースをゲットする。 -- [[GNU(ftp):ftp://ftp.gnu.org/gnu]] のサイトから以下を取得。 --- [[binutils:ftp://ftp.gnu.org/gnu/binutils]] --- [[gcc:ftp://ftp.gnu.org/gnu/gcc]] -- 今回は下記を使うものとする。 --- [[binutils-2.19:ftp://ftp.gnu.org/gnu/binutils/]] --- [[gcc-3.3.4:ftp://ftp.gnu.org/gnu/gcc/gcc-3.3.4/]] + 上記を Cygwin で適当なところに展開。 -- ここは /home/user/work に展開したとする。&br; $ tar zxvf binutils-2.19.tar.gz $ tar zxvf gcc-3.3.4.tar.gz + インストール先ディレクトリを作成。 -- ここは /usr/local/linux とする。&br; $ mkdir /usr/local/linux + Linux でつくった linux-runtime 配下のファイルを /usr/local/linux に配置。 $ mv -R (どこか)/linux-runtime /usr/local/linux $ ls /usr/local/linux lib include + /usr/local/linux/lib にある libc.so のパスを修正。 /* 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 ) ↓&br; /* 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 ) + binutils をコンパイル、インストール。 $ 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 + ここまでで /usr/local/linux/bin が作成されているはずなので、パスを通しておく。 $ PATH=/usr/local/linux/bin:$PATH + gcc をコンパイル、インストール。 $ 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 ※ オプション不要なものや足りないものがあるかもしれない。&br; ※ make で [configure-target-libiberty] 的なエラーが出るかも。とりあえず無視する。 + ここまでで、以下のフォルダが作成されているはず。 /usr/local/linux/bin /usr/local/linux/include /usr/local/linux/lib /usr/local/linux/man /usr/local/linux/share + bin の中に以下が出来上がっていればとりあえずコンパイラ完成。 i686-linux-as i686-linux-gcc i686-linux-g++ + 試しに簡単なソースをコンパイルしてみる。 $ i686-linux-gcc hello.c -o hello これで hello が出力される。が、Windows 上では実行できない。&br; Linux に hello を持っていって実行できれば、成功! となるはずが、私は上手くいかない。何か手順が足りないんだと思うけど。。 * Eclipse の設定 [#o514c93e] Cygwin 環境で、以下の構成になっているとする。 - C:/Cygwin -- /bin/make -- /usr/local/linux/bin/i686-linux-as -- /usr/local/linux/bin/i686-linux-gcc -- /usr/local/linux/bin/i686-linux-g++ Eclipse は CDT を使う。 - [[Eclipse:http://www.eclipse.org/]] -- [[Eclipse IDE for C/C++ Developers:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/SR2/eclipse-cpp-galileo-SR2-win32.zip]] 日本語化する(英語のままでも良いならここは不要)。ただ、下の説明は日本語化を前提に書いてるので、英語のままの場合は読み替えてネ。 - [[Eclipse 日本語化言語パック (サードパーティ版):http://www.igapyon.jp/blanco/nlpack/eclipse/index.html]] + Eclipse 起動。 + 「ファイル」→「新規」→「C++ プロジェクト」で、プロジェクト名「hello」、実行ファイル形式を選んで「完了」。 -- 「Hello World C++ Project」があればそっちで。&br; 最初からお決まりのサンプルがつく。 + Hello World がなかった場合はソースを作成。 -- 左ペインのプロジェクトを右クリックして「新規」→「フォルダ」で「src」フォルダ作成。 -- 「src」フォルダを右クリックして「新規」→「ソースファイル」で「hello.cpp」を作成。 -- 「hello.cpp」をダブルクリックして、以下を記述。&br; #include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; } + 左ペインのプロジェクトを右クリックして「プロパティ」を開く。 + 「C++ ビルド」下にある「ツール・チェーン・エディタ」を選択。 -- 構成はどちらでも良いけど、ここは「Release」をアクティブにする。 -- 現在のツールチェーン : Cygwin GCC -- 現在のビルダー : GNU Make ビルダー + 「C++ ビルド」下にある「環境」を選択。 -- 「設定する環境変数」に以下を追加。 --- 名前 : PATH --- 値 : C:\Cygwin\bin;C:\Cygwin\usr\local\linux\bin + 「C++ ビルド」下にある「設定」を選択。 -- 「ツール設定」に以下を設定。 --- GCC Assembler コマンド : i686-linux-as --- Cygwin C++ Compiler コマンド : i686-linux-g++ --- Cygwin C Compiler コマンド : i686-linux-gcc --- Cygwin C++ Linker コマンド : i686-linux-g++ -- 「成果物」に以下を設定。 --- 成果物タイプ : 実行可能 --- 成果物の名前 : hello --- あとは空白。 -- 「バイナリパーサー」に以下を設定。 --- 「Cygwin PE パーサー」と「Elf パーサー」にチェック。 --- あとは チェックをはずす。 + 「OK」でプロパティを閉じる。 + 「プロジェクト」→「すべてビルド(Ctrl + B)」でビルドしてみる。 + 画面下コンソールに特にエラーがなければ、Release フォルダに hello というファイルができる。 + その hello を Linux に持っていって実行してみる。 $ ./hello + 「Hello World!」と表示されれば、Windows 上で Linux のモジュールができたことになる! ----- [[Linux メモ]]