Cygwinを使ってWindows上でLinuxプログラムをコンパイルする方法
WindowsとLinuxはまったく異なる2つのOSであり、一方のために書かれたプログラムをもう一方へ移植するのは容易ではありません。特にGUIプログラムではその傾向が顕著です。クロスプラットフォーム対応のライブラリやSDKは数多く存在しますが、移植性を考慮せずに書かれたネイティブプログラムの移植は非常に困難です。
Windows上でLinux向けに書かれたプログラムをコンパイル・実行したい場合、「Cygwin」という解決策があります。Cygwinプロジェクトは、bashシェルやGNUコンパイラチェーンをはじめとする、定番のツールやコンパイラをWindows向けに集めたものです。さらに、Linux固有のAPIを呼び出すプログラムをコンパイルできるようにする互換レイヤーを提供するライブラリも含まれています。ただし、Cygwinはエミュレータや仮想マシンではないため、再コンパイルなしにLinuxバイナリをそのままWindowsで実行できるわけではない点に注意してください。
Cygwinのインストール手順
セットアッププログラムのダウンロードと実行
まずCygwinのインストールページにアクセスし、32ビット版または64ビット版のセットアップ実行ファイル(使用中のWindowsに合わせて選択)をダウンロードします。セットアッププログラムを実行し、「次へ」を2回クリックして「Install from Internet」を選択します。デフォルトのインストール先は「C:\cygwin」です。変更することも可能ですが、特別な理由がない限りデフォルトのままにするのがおすすめです。そのまま「次へ」を3回クリックして進みます。
必要なパッケージの選択
Cygwinプロジェクトは世界各地にミラーサイトを持っています。自分の所在地から近いと思われるサイトを選択して「次へ」をクリックしましょう。次に、インストールするパッケージを選択します。Windows上で簡単なLinuxプログラムをコンパイルするには、CコンパイラとC++コンパイラを提供するGNUコンパイラチェーン(GCC)が必要です。
検索ボックスに「gcc」と入力し、パッケージリストの「Devel」の横にある小さなプラス記号をクリックして展開します。「gcc-core」と「gcc-g++」を見つけて、それぞれ「Skip」の部分をクリックします。すると「Skip」という表示がバージョン番号に変わり、「Bin?」列の「n/a」表示がチェック済みのボックスに変わります。続いて検索ボックスに「make」と入力し、「Devel」カテゴリの「make」も同じ要領でインストール対象にします。さらに「wget」を検索して「Web」カテゴリからインストール対象にします。後述のビルド例では「libiconv」も必要になるため、これも検索してインストール対象にしておきましょう。
「次へ」をクリックすると、インストーラーが依存関係を解決するために必要な追加パッケージを確認します。推奨設定のまま「次へ」をクリックして承認します。
すべてのパッケージのダウンロードとインストールが完了したら、最後のステップを進めてインストーラーを終了します。「Cygwin Terminal」を起動すると、Linuxライクな開発環境に入れます。ターミナル内では「dir」のようなWindowsコマンドではなく、「ls」のようなシェルコマンドを使用する点に注意してください。
実際にLinuxプログラムをコンパイルしてみる
ここでは、W3が公開しているHTML-XMLパッケージを使って、Windows上でLinuxプログラムをコンパイルする流れを紹介します。このツールで何ができるのかについては、「コマンドラインからHTMLやXMLファイルを操作する方法」の記事も参考になります。
ソースコードのダウンロードと展開
「wget」を使ってソースファイルをダウンロードします。
wget https://www.w3.org/Tools/HTML-XML-utils/html-xml-utils-6.7.tar.gz
続いて、アーカイブファイルを展開します。
tar -zxf html-xml-utils-6.7.tar.gz
ソースファイルは「html-xml-utils-6.7」ディレクトリに展開されるので、そのディレクトリへ移動します。
cd html-xml-utils-6.7
configureとmakeによるビルド
ビルドを開始する前に、「configure」シェルスクリプトを実行して、このビルド環境に適したMakefile(ビルド手順書)を生成する必要があります。これは、Linuxでソースからパッケージをビルドする際の一般的な手順であり、Cygwinでも同様です。
./configure
「configure」が完了したら、「make」でビルドを開始します。
make
ビルドエラーへの対処
実はこのビルド、途中で失敗します。ここで別のプロジェクトに切り替えることもできましたが、あえてHTML-XML-utilsでの作業を続行することにしました。CygwinでLinuxプログラムをコンパイルする際、すべてが順調にいくとは限らないことを示す良い例になるからです。
この問題の解決策は実はシンプルです。エラーメッセージによると、リンカーが「iconv」ライブラリを見つけられないとのこと。リンクコマンドを確認すると、ライブラリの指定が抜けています。手っ取り早い解決策は、コマンドを手動で実行し、リンカーにlibiconvを使うよう明示的に指示することです。より「正しい」修正方法としては、Makefileなどを詳しく調べて、なぜライブラリが指定されていないのかを突き止めることになります。
以下のコマンドを実行します。末尾に「-liconv」が追加されている点に注目してください。
gcc -g -O2 -o hxindex.exe hxindex.o scan.o html.o openurl.o url.o heap.o class.o errexit.o connectsock.o types.o tree.o genid.o dtd.o headers.o dict.o fopencookie.o -liconv
「hxindex.exe」がビルドできたら、再度「make」と入力して残りのビルドを続行します。「make」は、何がビルド済みで何が未ビルドかをチェックし、適切な地点からビルドを再開する仕組みです。今回は「hxindex.exe」を手動でビルド済みなので、「make」はリスト内の次のバイナリから処理を続けます。
「make」が完了すると、html-xml-utils-6.7ディレクトリにすべての.exeファイルが生成されているはずです。
困ったときは
Cygwinの使用で行き詰まった場合は、まず公式のFAQやドキュメントを確認しましょう。それでも解決しない場合は、プロジェクトが提供するメーリングリストを活用できます。本記事の手順で問題が発生した場合は、下のコメント欄からお気軽にお知らせください。
-
Linux で起動可能な Windows 10 USB メモリを作成する方法
Linux 環境に Windows 10 をインストールするのは、決して複雑な作業ではありません。むしろ、手間やトラブルを避けたいのであれば、起動可能な Windows 10 USB メモリを作成するのが最適な方法です。この記事では、起動可能な Windows 10 USB の作成手順を、具体的な操作方法とあわせて詳しく解説します。それでは始めましょう。 Linux で起動可能な Windows 10 USB を作成する この作業には、大きく分けて2つの方法があります。1つ目の方法では、UEFI 互換の起動ディスクを作成できます。マウント作業を始める前にまず必要になるのが、Windows の
-
リモートアクセスで複数のPCのWindows 10スタートアッププログラムを管理する方法
スタートアッププログラムとは、パソコンの起動時に自動的に立ち上がるアプリケーションのことです。Microsoftのサービスや標準アプリにとっては便利な機能ですが、多くのサードパーティ製アプリも起動時に自動で立ち上がる傾向があることがわかっています。ウイルス対策ソフトのように必須なものもありますが、ほとんどの場合は不要と言えるでしょう。 スタートアップリストに多くのプログラムが登録されていると、OSとともに各アプリを起動するのに時間がかかるため、パソコンの起動が通常より遅くなります。さらに、多数のプログラムがメモリ(RAM)を占有するため、PC全体の動作が重く、もっさりとした動きになってしまい