Linux 上で Windows のモジュールをコンパイルする方法は Google 先生に聞くと結構出てくるけど、その逆がなかなか出てこない。

ということで Windows 上で Linux のモジュールをコンパイルする方法をメモ。

Windows 上に UNIX 環境を構築

Cygwin か MinGW/msys ということになると思う。導入に関する詳細は下記ページで。

ここでは Cygwin を使ってみる。

クロスコンパイラの作成

理屈としては、ターゲットとなる Linux の C++ 環境をターゲットとして、Cygwin で gcc をコンパイルすれば良いということになる。

と思ったけど、上手くいかないので、とりあえず以下のサイトからコンパイル済みのクロスコンパイラをいただいて使用することにする。

上記サイトの クロスコンパイラ をいただく。

クロスコンパイラを自前でつくる場合

実は、私もやろうとしたけど、挫折した。

一応、こうすればできるらしいということを、今後の為にメモしておく。

  1. まず、ターゲットとなる Linux 上で、作業用のディレクトリをつくる。
    • ここでは /tmp/linux-runtime とする。
      $ mkdir /tmp/linux-runtime
  2. C/C++ コンパイルに必要なライブラリ(依存関係も全て)をコピーする。
    • これが、どれが必要なのかよくわからないので、以下のディレクトリを全部コピー。
      $ cp -r /lib /tmp/linux-runtime/lib
      $ cp -r /usr/lib /tmp/linux-runtime/lib
      $ cp -r /usr/include /tmp/linux-runtime/include
    • 環境によっては 500MB 超える。1GB くらいになることも。
    • あからさまに C/C++ に関係ないディレクトリは削除しても良いと思う。
      python とか mozilla とか。
  3. linux-runtime を samba か scp か何かで Windows へ送る。
    • サイズが結構あるので、tar.gz とか lzma あたりで固めて移動すると良いかも。
  4. ここから Windows 側の作業。Cygwin はインストール済みという前提で。
    • Cygwin は C:\Cygwin にインストールされているとする。
  5. GNU の binutils と gcc のソースをゲットする。
  6. 上記を Cygwin で適当なところに展開。
    • ここは /home/user/work に展開したとする。
      $ tar zxvf binutils-2.19.tar.gz
      $ tar zxvf gcc-3.3.4.tar.gz
  7. インストール先ディレクトリを作成。
    • ここは /usr/local/linux とする。
      $ mkdir /usr/local/linux
  8. Linux でつくった linux-runtime 配下のファイルを /usr/local/linux に配置。
    $ mv -R (どこか)/linux-runtime /usr/local/linux
    $ ls /usr/local/linux
    lib include
  9. /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 )
        ↓
    /* 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 )
  10. 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
  11. ここまでで /usr/local/linux/bin が作成されているはずなので、パスを通しておく。
    $ PATH=/usr/local/linux/bin:$PATH
  12. 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
    ※ オプション不要なものや足りないものがあるかもしれない。
    ※ make で [configure-target-libiberty] 的なエラーが出るかも。とりあえず無視する。
  13. ここまでで、以下のフォルダが作成されているはず。
    /usr/local/linux/bin
    /usr/local/linux/include
    /usr/local/linux/lib
    /usr/local/linux/man
    /usr/local/linux/share
  14. bin の中に以下が出来上がっていればとりあえずコンパイラ完成。
    i686-linux-as
    i686-linux-gcc
    i686-linux-g++
  15. 試しに簡単なソースをコンパイルしてみる。
    $ i686-linux-gcc hello.c -o hello
    これで hello が出力される。が、Windows 上では実行できない。
    Linux に hello を持っていって実行できれば、成功!

となるはずが、私は上手くいかない。何か手順が足りないんだと思うけど。。

Eclipse の設定

Cygwin 環境で、以下の構成になっているとする。

  1. Eclipse 起動。
  2. 「ファイル」→「新規」→「C++ プロジェクト」で、プロジェクト名「hello」、実行ファイル形式を選んで「完了」。
    • 「Hello World C++ Project」があればそっちで。
      最初からお決まりのサンプルがつく。
  3. Hello World がなかった場合はソースを作成。
    • 左ペインのプロジェクトを右クリックして「新規」→「フォルダ」で「src」フォルダ作成。
    • 「src」フォルダを右クリックして「新規」→「ソースファイル」で「hello.cpp」を作成。
    • 「hello.cpp」をダブルクリックして、以下を記述。
      #include <iostream>
      using namespace std;
      
      int main() {
          cout << "Hello World!" << endl;
          return 0;
      }
  4. 左ペインのプロジェクトを右クリックして「プロパティ」を開く。
  5. 「C++ ビルド」下にある「ツール・チェーン・エディタ」を選択。
    • 構成はどちらでも良いけど、ここは「Release」をアクティブにする。
    • 現在のツールチェーン : Cygwin GCC
    • 現在のビルダー : GNU Make ビルダー
  6. 「C++ ビルド」下にある「環境」を選択。
    • 「設定する環境変数」に以下を追加。
      • 名前 : PATH
      • 値 : C:\Cygwin\bin;C:\Cygwin\usr\local\linux\bin
  7. 「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 パーサー」にチェック。
      • あとは チェックをはずす。
  8. 「OK」でプロパティを閉じる。
  9. 「プロジェクト」→「すべてビルド(Ctrl + B)」でビルドしてみる。
  10. 画面下コンソールに特にエラーがなければ、Release フォルダに hello というファイルができる。
  11. その hello を Linux に持っていって実行してみる。
    $ ./hello
  12. 「Hello World!」と表示されれば、Windows 上で Linux のモジュールができたことになる!

Linux メモ


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS