117
117

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-07-25

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

117
117
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
117
117

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?