Windows NetBeans C++開発環境(MinGW 64bit編)¶
はじめに¶
Windows上でCygwinやMinGWなどのオープンソースツール(GCC)のC++コンパイラを使った統合開発環境をNetBeansで構築することができます。
NetBeans IDEのC/C++版はデフォルトではGNU Makeでのビルドのみをサポートしています。
このページは、MinGW 64bit版を使った環境構築を対象とします。
ツールの設定¶
次のサイトに設定方法が紹介されています。
NetBeans - How To Create a 64bit C/C++ Windows Program with NetBeans
インストール¶
NetBeansのインストール¶
NetBeans IDEをダウンロードします。C++開発機能が含まれているC/C++版かすべて版のどちらかをダウンロードします。
MinGW 64とMSYSのインストール¶
MinGW 64とMSYSのインストールは次のページに記載しています。
Windows MinGW開発環境
コンパイルツールの設定¶
インストールが完了したらNetBeansを起動します。
[ツール]メニュー > [オプション] > [C/C++]ボタンを押し、[ビルド・ツール]タブを選択します。オプションダイアログが表示されます。
デフォルトではツールコレクション欄にはCygwinの設定が載っています。
(Cygwinをインストールしていたからかもしれません)
今回は、MinGW64を使用するのですが、MinGW64の設定はないので、ツールコレクションにMinGW64の設定を追加します。
[追加]ボタンを押し、「新規ツール・コレクションの追加」ダイアログが表示されるので、ベース・ディレクトリ欄にMinGW64をインストールしたディレクトリを指定します(次の画面)。
MinGW64だとベースディレクトリを指定するだけでは認識できないらしく警告がでています。
そこで、ツール・コレクション・ファミリに選択リストから「MinGW」を選択します。ツール・コレクション名は「MinGW64」と記載します(次の画面)。
MSYSに環境変数PATHが通っていれば、makeコマンドの欄にMSYSのmake.exeが設定されます。ただし、コンパイラ欄が空欄のままです。
注記
MSYSへの環境変数PATHが通っていないと、makeコマンドは次の画面のようにCygwinのmakeへのパスが設定されています。環境変数を見直してください。
NetBeansがMSYSのmakeコマンドを認識していないと、makeコマンドに手でパスを設定しても、Cygwinのシェルが使われて困ることがあります。
コンパイラコマンド(C, C++, Fortran, アセンブラ)を手動で指定します。
問題解決¶
Cygwinのmake.exeが使われてしまう¶
NetBeansがデフォルトで設定していたCygwinのmake.exeのままビルドを実行すると次のエラーが発生しました。
"/C/cygwin64/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf /bin/sh: /C/cygwin64/bin/make.exe: No such file or directory nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed make: *** [.build-impl] Error 127 ビルド FAILED (終了値2, 合計時間: 152ms)
NetBeansが、/bin/sh を実行していますが、このシェルはCygwinのものと思われます。
Cygwin(Ver.1.7.28)では、シェル上で/C/cygwin64/bin/make.exeのような指定では実行できません。
MinGW64のコンパイラとcygwinのmake(というかCygwinのシェル上でビルドが実行されると)はうまくいかないようです。MSYSが使われるよう環境変数PATHを確認してください。
参考までに、むりやりcygwinのmake.exe(とcygwinのシェル)で実行しようとした経緯を以下に載せておきます。
makeのエラー回避試行(1):部分的にOK¶
/C/cygwin64/bin/make.exe でmakeが実行できるようにすれば解決できると考え、Cygwin上で/C を/cygdrive/cへのシンボリックリンクとします。
$ ln -s /cygdrive/c /C
シンボリックリンク作成後、ビルドを実行するとOKとなりました。
"/C/cygwin64/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf make[1]: Entering directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' "/C/cygwin64/bin/make.exe" -f nbproject/Makefile-Debug.mk dist/Debug/MinGW64-Windows/hellomingw64.exe make[2]: Entering directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' make[2]: 'dist/Debug/MinGW64-Windows/hellomingw64.exe' is up to date. make[2]: Leaving directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' make[1]: Leaving directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' ビルド SUCCESSFUL (合計時間: 313ms)
この方法であれば、cygwinのcmakeを使うことも可能と思われます。
makeのエラー回避試行(2):NG¶
MinGW64のmakeを使うことにします。そこで、MinGW64のbinディレクトリをみると、make.exeが見当たらず、ただし、mingw32-make.exeが存在します。
[ツール]メニュー > [オプション] > [C/C++]ボタンを押し、[ビルド・ツール]タブを選択、makeコマンド欄にmingw32-make.exeへのパスを指定します。
すると、上の画面のようにエラーとなります。コマンド名はmake.exeでないと受け付けてくれません。
makeのエラー回避試行(3):NG¶
そこで、mingw32-make.exeへのシンボリックリンクファイルmake.exeを作ります。
管理者権限でコマンドプロンプトを起動し(スタートメニューからアクセサリ下のコマンドプロンプトを右クリックし[管理者として実行])、MinGW64のインストールディレクトリ下のbinへディレクトリを移動します。
C:\Windows\system32>cd "\Program Files\tools\mingw64\bin" C:\tools\mingw64\bin>mklink make.exe mingw32-make.exe make.exe <<===>> mingw32-make.exe のシンボリック リンクが作成されました C:\tools\mingw64\bin>dir make* C:\tools\mingw64\bin のディレクトリ 2014/03/01 10:05 <SYMLINK> make.exe [mingw32-make.exe]
[ツール]メニュー > [オプション] > [C/C++]ボタンを押し、[ビルド・ツール]タブを選択、makeコマンド欄に作成したシンボリックリンクmake.exeへのパスを指定します。
ビルドを実行します。
"/C/Program Files/tools/mingw64/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf /usr/bin/sh: /C/Program Files/tools/mingw64/bin/make.exe: No such file or directory nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed make: *** [.build-impl] Error 127 ビルド FAILED (終了値2, 合計時間: 154ms)
やはりエラーとなってしまいました。
makeのエラー回避試行(4):部分的にOK¶
NetBeansを起動する前に、環境変数PATHにmake.exeのあるディレクトリを追加し、NetBeansのmakeコマンド設定にはパスを省略し実行ファイル名make.exeだけを指定します。
[ツール]メニュー > [オプション] > [C/C++]ボタンを押し、[ビルド・ツール]タブを選択、makeコマンド欄にmake.exeだけ指定します。
ビルドを実行します。
"make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf make[1]: Entering directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' "make.exe" -f nbproject/Makefile-Debug.mk dist/Debug/MinGW64-Windows/hellomingw64.exe make[2]: Entering directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' make[2]: 'dist/Debug/MinGW64-Windows/hellomingw64.exe' is up to date. make[2]: Leaving directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' make[1]: Leaving directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' ビルド SUCCESSFUL (合計時間: 306ms)
NetBeansを実行するときだけ環境変数PATHにMinGW64を追加したいときは、バッチファイルに環境変数PATH設定をしてNetBeansを起動するよう記述し、デスクトップ等に貼っておきます。
@echo off :: 環境変数(グローバル) :: MinGW 64 GCC PATH=%PATH%;C:\Program Files\tools\mingw64\bin C:\Program Files\NetBeans 8.0 RC1\bin\netbeans64.exe
プログラム作成¶
Helloプログラムの作成¶
- [ファイル]メニュー > [新規プロジェクト] でカテゴリ欄C/C++を選択し、プロジェクト欄C/C++アプリケーションを選択、[次]ボタンを押します。
- プロジェクト名欄に HelloMinGW64 を入力、ツール・コレクション欄でMinGW64を選択し[終了]ボタンを押します。
main.cppに標準出力にハローメッセージを出力する定番のコードを書くことにします。プロジェクト作成時に自動生成されたmain.cppのコードから、コメントとusing namespace文を削除し、標準出力にHelloメッセージを出すコードを記述しました。
記述したコードの行頭に警告マークが付いています。
警告なのでこのままでもビルド・実行は可能です。
実行¶
makeの回避試行(4)を適用しています。
ビルドの出力は次のようになっています。
"make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf make[1]: Entering directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' "make.exe" -f nbproject/Makefile-Debug.mk dist/Debug/MinGW64-Windows/hellomingw64.exe make[2]: Entering directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' mkdir -p build/Debug/MinGW64-Windows rm -f "build/Debug/MinGW64-Windows/main.o.d" g++ -c -g -MMD -MP -MF "build/Debug/MinGW64-Windows/main.o.d" -o build/Debug/MinGW64-Windows/main.o main.cpp main.cpp: In function ‘int main(int, char**)’: main.cpp:16:50: warning: lambda expressions only available with -std=c++11 or -std=gnu++11 [enabled by default] []() { cout << "Hello, C++11 World" << endl; }(); ^ mkdir -p dist/Debug/MinGW64-Windows g++ -o dist/Debug/MinGW64-Windows/hellomingw64 build/Debug/MinGW64-Windows/main.o make[2]: Leaving directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' make[1]: Leaving directory '/cygdrive/c/Users/torutk/Documents/NetBeansProjects/C++/HelloMinGW64' ビルド SUCCESSFUL (合計時間: 751ms)
プログラムの出力は次のようになっています。
"make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf make[1]: Entering directory '/cygdrive/c/Users/toru/Documents/NetBeansProjects/Experiments/C++/HelloMinGW64' "make.exe" -f nbproject/Makefile-Debug.mk dist/Debug/MinGW64-Windows/hellomingw64.exe make[2]: Entering directory '/cygdrive/c/Users/toru/Documents/NetBeansProjects/Experiments/C++/HelloMinGW64' mkdir -p build/Debug/MinGW64-Windows rm -f "build/Debug/MinGW64-Windows/main.o.d" g++ -c -g -MMD -MP -MF "build/Debug/MinGW64-Windows/main.o.d" -o build/Debug/MinGW64-Windows/main.o main.cpp main.cpp: In function ‘int main(int, char**)’: main.cpp:16:50: warning: lambda expressions only available with -std=c++11 or -std=gnu++11 [enabled by default] []() { cout << "Hello, C++11 World" << endl; }(); ^ mkdir -p dist/Debug/MinGW64-Windows g++ -o dist/Debug/MinGW64-Windows/hellomingw64 build/Debug/MinGW64-Windows/main.o make[2]: Leaving directory '/cygdrive/c/Users/toru/Documents/NetBeansProjects/Experiments/C++/HelloMinGW64' make[1]: Leaving directory '/cygdrive/c/Users/toru/Documents/NetBeansProjects/Experiments/C++/HelloMinGW64' ビルド SUCCESSFUL (合計時間: 751ms)