Meadow で UTF-8(BOM 付き)を使う
そのときのまとめです。
まずは使えるように
以下のサイトなどに書いてあるのを参考させてもらって .emacs.el に記述を追加します。
http://memo358.blog18.fc2.com/blog-entry-19.html
; (set-language-environment "Japanese")よりも前に
(require 'un-define)
(require 'jisx0213)
新しくファイルを開いたときの文字コードも UTF-8 に
C-x C-f で新しくファイルを開いた場合の文字コードも UTF-8 にしたいので、
以下の行も .emacs.el に追加します。
(set-default-coding-systems 'sjis-dos)
(setq-default buffer-file-coding-system 'utf-8-ws-dos)
Windows ではファイル名やターミナルなどで使う他のコマンドが Shift-JIS だったりするので、
デフォルトは Shift-JIS で、ファイルを開いた時の文字コードで UTF-8(BOM) を指定する必要があります。
指定時の記述は utf-8 が BOM なしで、 utf-8-ws が BOM 付きです。
BOM
UTF-8 には BOM 付きと BOM なしとあって、この BOM というのは Byte Order Mark の略でエンディアンの違いによるバイト順を判定するためのバイトコードで、ファイルの先頭に付加されます。
ただ、UTF-16 とかの場合だとバイト順は重要なのですが、 UTF-8 は 1 バイトなので、バイト順というよりも UTF-8 を使っているという標識の意味でつけられます。
しかし、 英数字だけであれば ASCII コードと同じで、英語圏であれば変更してもソフトの対応が要らないというのが UTF-8 の売りでもあるので BOM なしという状態もあります。
この BOM ありなしはどちらも利点、欠点があって混在しているのですが、ソフトによっては BOM ついてないとエラーになるのもあれば、BOM ついているとエラーになるのもあったりといろいろやっかいなことを引き起こします。
VisualStudio2010 でも BOM なし UTF-8 で日本語使ってたりするとビルド時にワーニングがでてくるので、 ソースは BOM 付き UTF-8 にする必要があります。
Meadow が BOM を消しちゃうための対策
私が使っている Meadow が古いだけかもしれませんが、 Meadow では UTF-8 の対応が不十分です。
というのも、 BOM 付き UTF-8 のファイルをオープンした時、正常にファイル内容は読み取れているのですが、文字コードは BOM なし UTF-8 と判定してしまいます。
なのでこのファイルを Meadow で編集して保存すると BOM が取れています。
C-x [Return] f でファイルの文字コードを utf-8-ws にしてから保存すると BOM 付きで保存できるのですが、いちいち指定するのめんどくさいです。
そこで苦肉の策として C-x C-s でファイルを保存する際に自動的に文字コードを変更してから保存するように .emacs.el に次のコードを記述するようにしました。
(global-set-key "\C-x\C-s" '(lambda ()
(interactive)
(set-buffer-file-coding-system 'utf-8-ws-dos)
(save-buffer)))
(global-set-key "\C-x\C-S" 'save-buffer)
ここでは通常の保存も残しておきたかったので C-x C-S に変更しています。
これだと終了前やコンパイル前の y, n で聞かれる保存の場合には対応できていないので注意して下さい。
defadvice とか使えば、完全に保存する前に BOM 付きに変更できると思うので、文字コードは BOM 付き UTF-8 しか使わないという人は試してみるとどうでしょうか。
その場合は次のようなコードを追加します(ただし、ちゃんと試してないです)
(defadvice save-buffer-as-utf-8-ws (before save-buffer
activate compile)
(set-buffer-file-coding-system 'utf-8-ws-dos))
VS のビルドをコマンドラインで実行する
コマンドラインでビルドできるとバッチファイルなどのスクリプトで実行できるようになりますし、 Emacs 上からビルドもできるようになります。 Emacs 上でコンパイルする設定は以前少し書きました。
http://yohshiy.blog.fc2.com/blog-entry-10.html
私は Un*x 系での開発の場合は、編集、ビルド、デバッグとすべて Emacs 上からやるのですが、 Windows の開発でも 編集、ビルドまで Emacs 上でできます。デバッグだけはコマンドライン上からできないので、おとなしく Visual Studio でやってます。
MSBuild
ビルドをコマンドライン上からやるには MSBuild というプログラムを使用します。これは .NET ランタイムと一緒に配布されているもので通常以下の場所にインストールされています。
c:/Windows/Microsoft.NET/Framework/vX.X
ここに PATH を通せば、 MSBuild で呼び出せます。
使用法は以下の形式です。
$ MSBuild [プロジェクトファイル]
*.vcxproj(VS2010)、 *.vcproj のようなプロジェクトファイルだけでなく、*.sln のソリューションファイルもビルドできます。省略した場合はカレントフォルダにあるものを探して実行します。
オプションを指定していない場合はデフォルトの構成のものがビルドされます。ビルドの構成を指定して実行するオプションは若干面倒です。たとえば Release 指定してビルドする場合は以下のように呼び出します。
$ MSBuild /p:Configuration=Release
http://www.atmarkit.co.jp/fdotnet/special/msbuild01/msbuild01_01.html
.NET 以前
VC++6.0 など .NET の前の場合には 以下のようにしてビルドできます。
$ MSDEV.dsw /MAKE "target"
http://q.hatena.ne.jp/1213016943
Qt の場合
Qt の場合には qmake というツールを使って、 Qt 用のプロジェクトファイル(*.proj)から、 Un*x 系では make ファイル、 Windows 上では VC 用のプロジェクトファイルを生成することができます。
Windows 上で VC 用プロジェクトファイルを生成するためには *.proj の TEMPLATE の設定で vcapp を指定する必要があります。ただクロスプラットホームで開発している場合、 vcapp とプロジェクトファイルに記述すると今度は Un*x 系でエラーとなるので以下のようにして qmake を実行する必要があります。
$ qmake -tp vc
Windows 上でこの -tp vc をつけずに qmake を実行するとどうなるかというと、nmake という VC 用のメイクファイルが生成されます。 MSBuild を使うよりも nmake の方がビルドが若干速いようなので、私は Qt を Windows 上でコンパイルする場合 nmake を使っています。
ただし、この nmake は VS のスタートメニューの [Visual Studio 20XX コマンドライン] というところから実行すると上手くいくのですが、それ以外から実行しようとすると環境変数が設定されていないため、エラーとなります。
そこで、 Emacs などからビルドしたい場合には以下の環境変数を設定しておく必要があります。
- PATH
- INCLUDE
- LIB
- LIBPATH
設定する環境変数の値は以下のファイルなどを参考にして設定してください。
(VSのインストールフォルダー)\Common7\Tools\vsvar32.bat
VS で gcc のようにファイルを指定してビルドする方法
gcc(g++) などのコンパイラではファイルを指定してコンパイルします。
$ g++ main.cpp foo.cpp大きなアプリケーションになると各ソースファイルのコンパイルを定義した Makefile を作成して、 make でビルドするのが一般的です。
それに対して、 Visual Studio でプロジェクトを作ってから、ビルドします。
しかし、ちょっとした確認などで gcc のようにファイルを指定してコマンドラインで コンパイルしたい場合もあります。
実は Visual Studio にも cl というコマンドラインのコンパイラがあって、 gcc のようにソースファイルを指定してコンパイルすることができます。
使うための準備がいろいろあるのですが、前に書いた Windows 版 Qt で nmake を使ったビルド方法 とほぼ同じです。
今回はもう少し詳しく書いてみようと思います。
準備
コンパイルにはコンパイラやビルド用のライブラリファイルが必要となります。 これらをまずインストールする必要があります。- Visual Studio (Express)
- Microsoft Windows SDK
これで GUI アプリなども作成できるのですが、基本的なものしか用意されていないので、 実際に使えるようなアプリを使いたい場合には、 製品版を買うか、 Qt などのツールキットを使った方がいいと思います。
Windows SDK はヘッダやライブラリなどをまとめた開発キットで、前は Plathome SDK という名前でした。
環境設定
コンパイルをコマンドラインで行う場合にはいろいろと環境変数の設定が必要になってきます。これはインストール時にスタートアップメニューに追加された 「 Visual Studio コマンドプロンプト(XXXX)」 から実行すると環境変数を設定して、 コマンドプロンプトを実行してくれるので、設定する必要はありません。
しかし、 Windows 標準のコマンドプロンプトはちょっと使いづらいです。 そこで eshell, Windows Power Shell, nyacus といったのシェルツールを使いたくなってきますが、 この場合は環境変数の設定が必要となります。
環境設定画面は以下の手順で呼び出します。(Windows OS のバージョンの違いで微妙に違います)
- コンピューターを右クリックメニューから [プロパティ]
- [システムの詳細設定]
- [詳細設定] タブの [環境変数] ボタン
設定する環境変数は正確には以下のファイルの内容を確認する必要があります。
ただし、たいていは以下の設定だけでいけると思います。(VS のインストールフォルダー)\Common7\Tools\vsvar32.bat
環境変数 | 値 |
---|---|
VSINSTALLDIR | (VS のインストールフォルダー) |
WindowsSdkDir | (Windows SDK のインストールフォルダー) |
INCLUDE | %VSINSTALLDIR%\Include;%WindowsSdkDir%\Include |
LIB | %VSINSTALLDIR%\Lib;%WindowsSdkDir%\Lib |
LIBPATH | %LIB% |
PATH | %VSINSTALLDIR%\Bin;%WindowsSdkDir%\Bin;(.NET フレームワークのフォルダー) |
%xxx% は環境変数の値を他の値の定義で使用するための記述方法です。
正確には、 VSINSTALLDIR や WindowsSdkDir の変数は他の変数に直接フルパスを書けば、 必要ないのですが、インストール先を変更した場合などに一箇所変更するだけですむようにしています。
.NET フレームワークのフォルダーは以下のようなパスです。 これはフレームワークのバージョンによって、最後のフォルダー名が変わります。
c:\Windows\Microsoft.NET\Framework\v4.0.30319
使用法
使用方法は gcc などのコンパイラとほぼ同じです。ソースファイルを引数に指定して実行します。 複数のファイルがある場合でも、他のコンパイラと同様にリンカーも自動的に呼び出して 結合してくれます。
$ cl main.cpp foo.cpp出力される実行ファイルは指定しなかった場合は、 "ファイルのベース名" + .exe となります。 上記の例では main.exe が生成されます。
指定する場合は /Fe オプションを使用します。
$ cl /Febar.exe main.cpp foo.cpp # bar.exe が生成されます。".exe" は省略可能です
その他のオプションは MSDN に一覧があります。
よく使うオプションとしては次のようなものだと思います。
オプション | 目的 |
---|---|
/HELP | ヘルプ(コンパイラ オプションのリスト)を出力 |
/D | 定数とマクロを定義 |
/I | インクルードファイルの検索パスの追加 |
/EH | 例外処理のモデルを指定。 STL など標準ライブラリを使う場合は /EHsc と指定していないとワーニングが発生します。 |
他にはデバッグビルドの指定などを gcc などのコンパイラーではよく使うと思いますが、 デバッグをしたい場合は VS プロジェクトを作る必要があるので、そちらを使用した方がいいでしょう。
dll(ダイナミックリンクライブラリ) を使用する場合、 公開関数の定義情報を持つ lib ファイルをコンパイル時に指定する必要があります。
この lib ファイルの指定方法は通常のファイルと同じように引数として指定するだけです。
$ cl main.cpp user32.libただし、この指定する lib ファイルへのパスが環境変数 LIB で定義されている必要があります。
指定する lib ファイルは WIN32API の MSDN に関数でどの lib が必要かという情報が書かれていますので、 そちらを見て、指定を追加するようにしてください。