NetBeansからMSYS2のgccを使うといくつか問題が起きます。
- NetBeansがMSYS2を自動認識しない
- パスが通らない
- 文字化けする
パスと環境変数を設定するラッパーを用意することで解決を試みました。
※ 公式な手段があるのかもしれませんが、不明なので力技です。
ラッパー
次のようなファイルを作成します。
※ MSYS2のインストール先が異なる場合はUSR
を適宜修正してください。
# include <stdlib.h>
# include <unistd.h>
# include <string>
# include <vector>
# define USR "C:\\msys64\\usr"
std::string lower(const std::string &s) {
std::string ret;
for (int i = 0; i < s.size(); i++) {
char ch = s[i];
if ('A' <= ch && ch <= 'Z') ch += 32;
ret += ch;
}
return ret;
}
int main(int argc, const char *argv[], const char *envp[]) {
const char *make = USR"\\bin\\make.exe";
argv[0] = make;
std::vector<const char *> envs;
std::string path;
for (int i = 0; envp[i]; i++) {
std::string e = envp[i];
std::string e5 = lower(e.substr(0, 5));
if (e5 == "path=") {
path = "PATH="USR"\\bin;"USR"\\local\\bin;" + e.substr(5);
envs.push_back(path.c_str());
} else if (e5 != "lang=") {
envs.push_back(envp[i]);
}
}
envs.push_back("LANG=C");
envs.push_back(NULL);
return execve(make, const_cast<char **>(argv), const_cast<char **>(&envs[0]));
}
コンパイルしてMSYS2のルートに置きます。DLLに依存しないよう、Win32ネイティブでスタティックリンクします。
$ x86_64-w64-mingw32-g++ -static -s -o /make-wrap make-wrap.cpp
※ 要 pacman -S mingw-w64-cross-gcc
NetBeansの設定
NetBeansで環境を設定します。
プラグインの確認
C/C++プラグインがインストールされているか確認します。
ツール → プラグイン
インストールされていなければ、インストールしてください。
プラグインの設定
ツール → オプション → C/C++ → [追加]
ベース・ディレクトリとツール・コレクション・ファミリを選択 → [OK]
※ CygwinやMinGWを選択するとうまく動かないためInterixを指定しています。
CコンパイラとC++コンパイラとmakeコマンド(先ほど作成したラッパー)を指定
コード支援 → インクルード・ディレクトリで...\usr\usr\include
を変更 → 重複する\usr
を取り除く
C++コンパイラについても同様に処置 → [OK]
以上で設定は完了です。