Windowsでgccなどを利用できるMSYS2の環境設定など

  • 104
    Like
  • 2
    Comment
More than 1 year has passed since last update.

windowsでgccなどのlinux用コマンドが使える環境としてMsysがありますが、最近はMsys2と呼ばれるものが出てきて、だいぶ安定して実用できる感じになってきました。
日本語もちゃんと認識できるところがいいですね。
(ただしコード表現はUTF-8ですが)

環境設定して、いろいろコンパイルできるようになったので、とりあえず環境設定のやり方などを書いていこうと思います。

インストール

http://sourceforge.net/projects/msys2/files/Base/
より、環境にあったものをダウンロードしてください。
64BitOSならば64bit版を落としておきましょう。
(64Bit→x86_64、32Bit→i686です)

その後インストーラよりインストールすると、c:\にフォルダができてます。(64Bitならmsys64になります)

その中にあるmsys2_shell.batを動かしてシェルが動けばOKです。
一旦閉じてもう一度msys2_shell.batを動かしてから

$ pacman -Suy

としてシステム全体を更新しておきましょう。

なお、ホームディレクトリ(/home/ユーザ名)は、msys\home\以下にあります。

初期設定など

後はお好みで...と言ったところですが、デフォルトでは必要最小限しか入ってないので、、

$ pacman -S vim gcc git gcc-libs openssh

くらいは入れておけばよいかと思います。

各種設定

MSYS2のvimは互換モードで動いてしまいとにかく使いにくいので、最低限.vimrcは設定しておきましょう。

.vimrc

set nocompatible
set number
set title
set ruler
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set noexpandtab
set backspace=indent,eol,start
set mouse=a

あと、.inputrcはデフォルトでも入力に問題がありませんでしたが、一応、Allow 8-bit input/outputとか書いてある箇所に以下を追記しておきます。

.inputrc

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

ハマったこととか

msysフォルダにある mingw32_shell.bat などでシェルを動かして、これらのgccでコンパイルすると、何故かコマンドラインの引数だけがShift-JISのまま引き渡されるようになってました。

不思議なのが、cinやscanfで取ってきた標準入力からの文字列は双方ちゃんとUTF-8のまま入ってるという点です。。

これはなかなか気が付きにくいですが、いろいろ調べてみると、動かすgccやライブラリも変わってくるのが原因かなといったところでした。
(mingwxxは他のmingwプロジェクトとの互換性を重視しているから?)

msys2_shellで動かした場合、gccは/usr/bin/gccのものを使います。
mingw32_shellで動かすと/mingw32/bin/gccのものを使います。

なので、よほどのことがない限り、shellはmsys2_shellで動かしたほうが良さそうです。

もし、mingw系のシェルでやる場合は、次のようにiconvを使うような変換用のコードを入れておくと良い感じになります。

#include <string>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string.h>
#include <iconv.h>

// MSYS-MINGWの場合、なぜかコマンドラインだけはSJISのままなのでUTF8にコンバートする
void convargv(char *src,std::string &dest)
{
    iconv_t ic = iconv_open("UTF-8", "SJIS");
    char *pin=src;
    char *pou;
    size_t ilen = strlen(src);
    // 半角かなの変換にUTF8は3オクテット必要
    size_t olen = ilen*6+10;

    dest.resize(olen);
    pou = &dest[0];

    iconv(ic,&pin,&ilen,&pou,&olen);
    *pou = '\0';

    iconv_close(ic);
}


using namespace std;
int main(int argc,char *argv[])
{
    string outstr;
    string instr;
    string xstr;

    convargv(argv[1],xstr);
    cout << xstr << endl;


    outstr = "てすとん";
    cout << outstr << endl;
    cout << "何か入力してください" << endl;

    cin >> instr;
    cout << "結果" << endl;
    cout << instr << endl;

    return 0;
}

gccなどでコンパイルするときは、-liconvをオプションに追加しないとエラーになります。

それにしても江添さんも仰せの通り、iconvの関数仕様がけっこうあれなので、できればiconvは使いたくないところですね。。

本の虫:iconvがクソすぎる
http://cpplover.blogspot.jp/2012/04/iconv.html

参考文献

MSYS2でMinGW環境整備(2)
http://arithmeticoverflow.blog.fc2.com/blog-entry-33.html