気の向くままに辿るIT/ICT/IoT
コンパイル環境

コンパイル環境

ホーム前へ次へ
コンパイル環境とは?

コンパイル環境

コンパイル環境

 意識してcc/gccなどコンパイラを使ったコンパイルを行う環境と言えば、やはりUNIX/Linuxです。

 でも、そうなると。。。

 他にもいろいろ方法はあるらしい。。。どれにしよう。。。?

 自宅のWindows環境でUNIX/Linux環境を使いたい学生やUNIX/Linux環境で仕事をしている業界人や研究者、教授、教師、講師、えらいITリテラシの高い業界関係外の人、はたまたホームページ作りが高じてWindowsやMacOSのローカルでActivePerlローカル接続によるWEBサーバ/RDB/CGI環境を作り始めたらUNIX/Linux環境に関心を持ち始めた場合など、ある日ある時、Windowsマシンで手軽にUNIX/Linux環境を。。。シェルを。。。できればより安価に、もっとできればフリーソフトやオープンソースで。。。と探し始めることがあっても全く不思議はありません。

 幸いそんな願いが叶う特定の言語専用のコンパイラや複数の言語をサポートするGUI統合環境、UNIX/Linux風環境をかなりリアルに再現してくれるオープンソースがあったりします。

特定言語のコンパイラ

 UNIX/Linuxではコンパイラは日常至極当たり前のツールですが、WindowsでもC/C++に関しては以前からBorland C/C++、Microsoftの自社製品用Visual Studio Express(VB/VC/VC++/各.NET)などのフリーのコンパイラがあり、Javaは当初からあらゆるプラットフォームで利用することが前提だったのでJava開発環境をインストールすればコンパイラも当然あります。

統合開発環境

 特定の言語だけじゃなくて複数の言語で使える環境ないかなと言う場合には、IDE/Integrated Development Environment/統合開発環境にはコンパイラも組み込まれています。

 EclipseならJava/C/C++/C#/Perl/Python/PHP/Ruby/JavaScript/COBOLなどプラグインとして拡張できますし、Java系だけでよければ、Java/Servlet/JSP/JavaFX/Java MEなどJava専用のNetBeansもあります。

WindowsでLinux

 GUIツールもいいけど、UNIX/LinuxにもX Window Systemあるけど、やっぱりCUIも使いたいとか、シェルやシェル含めUNIX/Linuxコマンドを使いたいよねと言う場合もあると思います。

Windows上で使えるLinux環境

 coLinuxは、Windowsアプリケーションとして実行でき、起動されたアプリケーション上は、(ごく一部Windows機能を使用した)Linux環境を実現できます。

UNIX/Linux風環境

 Windows環境そのままにUNIX/Linux風の環境を利用できるものにCygwinやMinGWなどがあります。

 ちなみにWindowsマシンにCygwinなどをインストール後、相応の環境設定(特に環境変数PATHの設定)がなされていれば、(Cygwin環境の.exeファイルの実行もできる状態になるので必然的に)Windowsのコマンドプロンプトからもシェルを含むCygwin環境のコマンドを利用できます。

 尤もCygwinのターミナルはコマンドプロンプトを利用したものですし、コマンドプロンプトやCygwinでデフォルトのコマンドプロンプトを流用したターミナル端末も良いですが、例えばセキュアなフリーソフトのTera Term pro(TTSSH/Tera Term SSH)をインストールすると付属しているCygwin用バッチcygterm(「その他の設定」メニューのCygwinタブで必要な設定ができる)を使う手もあります。

 ましてUNIX/Linuxログインシェルの利用経験があれば、その際に利用していたと思われるターミナルエミュレータでCygwinを利用すれば、なんら違和感がありませんし、ローカル環境でもcygtermなどを使えば同様です。

Windows風環境

 一方、Linuxで擬似的にWindows環境を構築できるフリーソフトにWine等があります。

Cygwin/MinGW/Wine...

 MinGWは、軽量設計で手軽にインストール、ミニshell環境ともいえるMSYS/Minimal SYStemを使って単独で開発することができ(Cygwinは機能充実の一方で容量的にもインストール時間的にも決して手軽とは言えない)、Windows上のCygwinからも、また、LinuxからもMinGW環境用にクロスコンパイルすることが可能です。

 このクロスコンパイルが可能であることは、Linuxで、または、Windows上のUNIXライクな開発環境でWindowsで動作するプログラムを構築したい場合、かなり興味深い意味があります。

Cygwin/MinGW...DLLと実行と配布

 まず、こうした環境や用途を考える場合、CygwinでC/C++などコンパイルが必要なプログラミング言語については特に注意が必要です。

 なぜなら、Cygwinでは、よりUNIX環境に近づけるべくPOSIX準拠の為にC標準ライブラリ含めcygwin1.dllという独自のライブラリを実行時に参照しており、gccもcyggcc_s-1.dllを参照している場合もあるなどCygwinのDLL/Dynamic Link(Linking) Library(Libraries)/ダイナミックリンクライブラリに依存する為にCygwinをインストールしていない環境やインストールされていてもCygwinやコマンドのバージョン違いなどの理由からある環境のあるバージョンのCygwinのあるバージョンのコンパイラでそのままコンパイルしたプログラムをWindowsで広く利用できる可能性が必然的に低くなるからです。

 一方、CygwinほどUNIXライクではないものの、Windows環境でGNUツールを使うことを重視したMinGWではWindowsのランタイム環境だけ(で単独のライブラリなし)でも生成したプログラムを実行することが可能な為、(結果的にPOSIX機能は採用しませんが、)Cygwinに比し、Windows上で広く利用できる可能性が高くなります。

 但し、MSYSでコンパイルする場合、MinGWでもMSYS独自のライブラリを利用する場合もあるので、MinGWのこうしたケースでも、Cygwinのcygwin1.dllにしても独自のライブラリをリンクしているプログラムを配布する場合にはライセンス(LGPL/GPL等)に注意する必要があります。

 よってWindows上のUNIXライクな環境を利用できれば良く、仮にDLLのバージョンの差異などに悩まされたとしても極めて限られた影響の少ない環境下でコンパイルを要する言語で生成されるプログラムの配布を考慮する必要がない場合にはCygwinの方が遥かに充実していますが、より広くWindows上で動作するプログラムを作りたい場合や、ましてLinux環境で開発したプログラムをWindowsで動作させたい場合には、MinGWという選択肢が視野に入ってきます。

CygwinでMinGW実行可能形式を生成

 こうした背景もあり、MinGWのウェブサイトではPOSIX機能を利用したい場合はCygwinを使うとよいと記述がありますし、他方、Cygwinではgccによるコンパイル時のコンパイルオプションによってMinGW形式で実行ファイルを生成することが可能になっており、実質、相互に補完関係にあるともいえます。

$ gcc -o cygwintype foo.c 

$ gcc -o mingwtype -mno-cygwin foo.c 

 尚、gccのバージョンの中には、限定的と思われる-mno-cygwinオプションを利用できないバージョンが存在し、そうした場合、下記のようなメッセージが表示され、コンパイルが完了しないケースがあります。

$ gcc -o mingwtype -mno-cygwin foo.c 

 gcc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler. 

 その場合、gccパッケージではなく、gccコマンドのバージョン3(gcc-4/gcc-3)の内、gcc-4では、先のエラーが出力され、gcc-3では利用できるのでgcc-4がある場合、gcc-4へのシムリンクとなっていると思われるgccではなく、gcc-3など旧バージョンを明示的に指定した状態でコンパイルすれば回避できます。

$ gcc-3 -o mingwtype -mno-cygwin foo.c 

 尚、Cygwinやコマンドのバージョン情報は、オプションなしのcygcheckにコマンド名を引数として渡すと確認でき(引数がないとインストールされている全てを表示)、パッケージは、cygcheckを-cオプション付きでcygwinやgccなど引数を渡せば表示されます。

$ cygcheck gcc             ←詳細(gcc/gcc-3/gcc-4...etc.)

$ cygcheck                   ←全て

$ cygcheck -c cygwin    ←cygwinパッケージバージョン

$ cygcheck -c gcc         ←gccパッケージバージョン

 コンパイルが完了したら、先の例のようにオプションを渡さず普通にコンパイルして生成された任意の名前のcygwintypeとこのオプションを渡して生成された任意の名前のmingwtypeという実行ファイルが実行に際してリンクしているDLLを参照比較してみるとよいでしょう。

 その場合、UNIX/Linuxシステムコマンドobjdumpに-pオプション付きで実行ファイル(バイナリファイル)を渡すとリンクしているDLLとその詳細が表示されますが、表示結果は、grepでDLL名に絞ったものだけ例示します。

$ objdump -p cygwintype 

$ objdump -p mingwtype 

$ objdump -p cygwintype | grep "DLL Name" 

DLL Name: cygwin1.dll 
DLL Name: cyggcc_s-1.dll 
DLL Name: KERNEL32.dll 

$ objdump -p mingwtype | grep "DLL Name" 

DLL Name: msvcrt.dll 
DLL Name: KERNEL32.dll 

 確認してみるとmingwtypeは、Windowsの通常のランタイム(実行時)環境(においてリンクされるDLL)さえあれば動作することがわかります。

 ちなみにobjdumpコマンドにも多くのオプションがありますが、例えば、-dや-Dオプション付きで実行ファイル(バイナリファイル)を渡すと逆アセンブルによりテキスト形式でダンプを参照することもできます。

LINK

ホーム前へ次へ