Help us understand the problem. What is going on with this article?

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

More than 5 years have 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

chromabox
おしごと: プログラマ スキル: C C++ JAVA Linux関連 ASM少々(ARM X86) ドライバ、boot層からGUI、win32等幅広く手広くやってます。 Linuxのドライバとかカーネルも多少は触れます。 goとか近代的な言語も習得したいですね
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした