Microsoft C/C++を使ってみよう

前回の作業で、開発環境として「Visual Studio Build Tools 2022」をインストールし、Microsoft製のC/C++ビルドツールを使えるところまでセットアップした。Visual Studio Build Tools 2022はビルドツールであり、利用するにあたって、Visual Studioのような統合開発環境は必須ではない。エディタと、ビルドツールとしてインストールされるコマンドを使うだけで開発が行える。

ただし、ビルドツールとして機能させるには、いくつかの環境変数を適切な値に設定する必要がある。これはかなり面倒なので、最初から環境変数が設定されたコンソールアプリケーション「Developer Command Prompt for VS 2022」で作業を行っていく。このCUI環境は起動直後からビルドツールを使うために必要となる環境変数が設定されているので、そのまま開発作業を行うことができる。

Hello World!

定番のHello World!を用意する。

helloworld.c

#include

int main()

{

printf("新大陸へようこそ!\n");

return 0;

}

「Developer Command Prompt for VS 2022」でこのファイルを閲覧しようとすると、次のように文字化けすることがある。

日本語が文字化けしている


これは文字コードの違いが原因だ。ここではhelloworld.cはUTF-8で作成されている。しかし、日本語環境だと「Developer Command Prompt for VS 2022」はデフォルトではCP932 (Shift_JISを拡張したもの)が使われていると思う。ファイルの文字コードとコンソールの文字コードが違うので文字化けするわけだ。

コンソールに設定されている文字コードは、次のようにchcpというコマンドで確認できる。

Developer Command Prompt for VS 2022のコードページ:932 (拡張されたShift_JIS)


ソースコードの文字コードにUTF-8を使っているなら、次のように「chcp 65001」とコマンドを実行してDeveloper Command Prompt for VS 2022の使う文字コードをUTF-8へ変更してやるとよい。これで文字化けしなくなる。

Developer Command Prompt for VS 2022のコードページ:65001 (UTF-8)へ変更


では、helloworld.cをコンパイルして実行してみよう。やり方はいくつかあるが、仕組みを理解するために、cl.exeコマンドでオブジェクトファイルを生成し、link.exeコマンドでリンクして実行ファイルを生成する方法を試してみよう。まず、次のように「cl.exe /c helloworld.c」と実行して、Cのソースコードからオブジェクトファイルを生成する。

cl.exe: Cソースコードをオブジェクトファイルへコンパイル


次に、link.exeコマンドを「link.exe helloworld.exe」のように実行してリンクを行いオブジェクトファイルから実行ファイルを生成する。

link.exe: オブジェクトファイルから実行ファイルを生成


helloworld.exeという実行ファイルが生成されるので、これを実行する。

helloworld.exeを実行


上記のスクリーンショットのように、helloworld.cのビルドが成功し、実行ファイルが動作していることを確認できる。LLVM Clangで行う作業とほぼ同じだ。異なるビルドツールを使っているため使用するコマンドやオプションは異なるが、基本的にC/C++開発で行う作業はほぼ同じだ。



nmakeを使ってみよう

LLVM Clangを使っているときは、ビルドツールとしてGNU makeを使用した。今回のケースでLLVM Clangでビルドすることを前提とした場合は、次のようなMakefileを用意してGNU makeで使うことになる。

GNU make 用の Makefile

CMD= helloworld.exe

SRCS= $(wildcard *.c)

OBJS= $(SRCS:.c=.o)

CC= clang

CFLAGS+=-g

EXIST= cmd.exe //C if exist

build: $(CMD)

$(CMD): $(OBJS)

$(CC) $(CFLAGS) -o $(CMD) $(OBJS)

.c.o:

$(CC) -c $< -o $@

clean:

$(EXIST) $(CMD) del $(CMD)

$(EXIST) main.o del $(OBJS)

$(EXIST) $(CMD:.exe=.ilk) del $(CMD:.exe=.ilk)

$(EXIST) $(CMD:.exe=.pdb) del $(CMD:.exe=.pdb)

$(EXIST) $(CMD).stackdump del $(CMD).stackdump

$(EXIST) nul del *.tmp nul

Microsoft C/C++でも同じようにGNU makeを使ってもよいのだが、MicrosoftはnmakeというMicrosoftのmakeを持っている。Visual Studio Build Tools 2022をインストールして使うのだから、ビルドシステムとしてnmakeを使ってみよう。GNU makeのような拡張機能はないが、基本的にはmakeそのものだ。

先ほどのGNU make向けMakefileをMicrosoft nmake向けに書き換えると、次のようになる。

Microsoft nmake 用の Makefile

CMD= helloworld

CC= cl.exe

CFLAGS= /c

LINK= link.exe

LIBS=

LFLAGS=

EXIST= cmd.exe /C if exist

all: build

build: $(CMD).exe

$(CMD).exe: $(CMD).obj

$(LINK) $(LFLAGS) $(LIBS) *.obj

dir

.c.o:

$(CC) $(CFLAGS) $*.c

clean:

$(EXIST) $(CMD).obj del *.obj

$(EXIST) $(CMD).exe del $(CMD).exe

dir

実行すると、次のようになる。

nmake 用の Makefile と nmake コマンドの実行例


ここまでに説明してきたような操作がVisual Studio Build Toolsを使う場合の最も基本的なコマンドの使い方ということになる。Visual Studioといった統合開発環境を使うと、環境変数の設定やビルド指定などさまざまな部分を統合開発環境側が補佐してくれる。補佐してくれない場合の使い方が今回のサンプルということになる。

巨大な複雑なソフトウェアであったとしても、基本的にはこうした基本的なコマンドの組み合わせでビルドされている。小さなソースコードを使ってこうした基本的な部分の動きを知っておくと、ビルドに問題が出たときや、別のプラットフォームに移植するときなどの問題解決に役立つことがある。

○参考

NMAKE Reference | Microsoft Docs