C言語 - MSVC コンパイラ(CL.exe)で Hello World!
C言語 - MSVC コンパイラ(CL.exe)で Hello World!
C言語で確認したい点があり、わざわざ Visual Studio 立ち上げるまでもないからコマンドラインでコンパイルしようと思ったが意外と苦労したという話。
結論 → 開発者コマンドプロンプトの使用を推奨
開発者コマンドプロンプトが使えるならそちらを使ったほうが楽でいい。
コンパイラ(CL.exe)のパス、インクルードファイルやライブラリで参照が必要なフォルダの設定がある程度されているので、余計なことでつまずく心配がない。
開発者コマンドプロンプトでのコンパイル
ソースファイル helloworld.c をコンパイルする。
CL helloworld.c
実行ファイル helloworld.exe が生成された。何も難しいことはない。
Microsoft(R) C/C++ Optimizing Compiler Version 19.16.27050 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
helloworld.c
Microsoft (R) Incremental Linker Version 14.16.27050.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:helloworld.exe
helloworld.obj
★非推奨★ コマンドプロンプトでコンパイル
開発者コマンドプロンプトではない普通のコマンドプロンプトで一からやると、インクルードファイルがないだのライブラリがないだのエラーばかりで一向に先に進まない。
まったくおすすめしないが、それでもいいならどうぞ。
以降、私のトライアル・アンド・エラーの記録をそのまま残しておく。
コンパイラ(CL.exe)の場所
私の端末には Visual Studio 2017 Professional がインストールされている。
開発者コマンドプロンプトでコンパイラの場所を確認したところ、以下の場所にあった。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional> where CL
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\cl.exe
ちなみに bin フォルダの配下には全部で4つの CL.exe が存在した。
どの場合に何を使えばよいか分からないが、今回は場所の確認で出力された Hostx86\x86\cl.exe を素直に使うことにする。
bin:
Hostx64\x64\cl.exe
Hostx64\x86\cl.exe
Hostx86\x64\cl.exe
Hostx86\x86\cl.exe
毎回パス入力するのは面倒なので、パスを通しておくことをおすすめする。
コンパイラの使い方
CL.exe を引数なしで実行すると、以下のように使い方が出力される。
Microsoft(R) C/C++ Optimizing Compiler Version 19.16.27050 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
使い方: cl [ オプション... ] ファイル名... [ /link リンク オプション... ]
/? を付けるとオプションの説明が出力される。
Microsoft(R) C/C++ Optimizing Compiler Version 19.16.27050 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
C/C++ COMPILER OPTIONS
-最適化-
/O1 最大限の最適化 (スペースを優先) /O2 最大限の最適化 (速度を優先)
/Ob インライン展開 (既定値 n=0) /Od 最適化を無効にする (既定)
/Og グローバルな最適化を有効にする /Oi[-] 組み込み関数を有効にする
:
: 以下省略
コンパイルしてみる
定番の「Hello World!」を出力するプログラムをコンパイルしてみる。
#include
int main() {
printf("Hello World!");
return 0;
}
コンパイルする(CL.exe を実行する)。
CL helloworld.c
エラーになった。
そうか、stdio.h すら見つけられないのか……。
helloworld.c(1): fatal error C1034: stdio.h: インクルード パスが設定されていません。
インクルードファイル(stdio.h)のフォルダを指定する
インクルードファイルの検索フォルダを追加する方法は2つある。
- コンパイラオプションの “/I” を使う。
- 環境変数 “INCLUDE” に設定しておく。
優先順位はコンパイラオプションの方が高い。
まず “/I” オプションで指定されたフォルダを指定された順番で検索する。
見つからなければ、続けて “INCLUDE” 環境変数で指定されたフォルダを検索する。
(補足)
“/I” とパスの間の空白は省略できる。
パスがスペースを含む場合はダブルクォートで囲む。
絶対パスでも相対パスでもよい。
stdio.h
はC:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt
フォルダにある。
/I オプションを付けて再コンパイルする。
CL /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt" helloworld.c
またエラーになった。
今度は vcruntime.h が見つからないらしい。
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt\corecrt.h(10): fatal error C1083: include ファイルを開けません。'vcruntime.h':No such file or directory
インクルードファイル(vcruntime.h)のフォルダを指定する
/I オプションに vcruntime.h のフォルダを指定して再コンパイルした。
CL /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt" /I"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include" helloworld.c
リンカーのエラー。
ライブラリ LIBCMT.lib が見つからないとのこと。
LINK : fatal error LNK1104: ファイル 'LIBCMT.lib' を開くことができません。
ライブラリ(LIBCMT.lib)のフォルダを指定する
ライブラリの検索フォルダを追加する方法は2つある。
- リンクオプションの “/LIBPATH” を使う
- 環境変数 “LIB” に設定しておく。
優先順位はリンクオプションの方が高い。
まず “/LIBPATH” オプションで指定されたフォルダを指定された順番で検索する。
見つからなければ、続けて “LIB” 環境変数で指定されたフォルダを検索する。
なお、リンクオプションを付けるときは “/link” に続けてオプションを書く必要がある。
再コンパイルする。
CL /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt" /I"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include" helloworld.c /link /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x86"
エラー。 kernel32.lib が見つからない。
LINK : fatal error LNK1104: ファイル 'kernel32.lib' を開くことができません。
ライブラリ(kernel32.lib)のフォルダを指定する
再コンパイルする。
CL /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt" /I"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include" helloworld.c /link /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x86" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x86"
エラー。 libucrt.lib が見つからない。
LINK : fatal error LNK1104: ファイル 'libucrt.lib' を開くことができません。
そろそろ飽きてきた。
ライブラリ(libucrt.lib)のフォルダを指定する
再コンパイルする。
CL /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt" /I"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include" helloworld.c /link /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x86" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x86" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x86"
エラーは出なかった = コンパイルが成功した。
Microsoft(R) C/C++ Optimizing Compiler Version 19.16.27050 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
helloworld.c
Microsoft (R) Incremental Linker Version 14.16.27050.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:helloworld.exe
"/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x86"
"/LIBPATH:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x86"
"/LIBPATH:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x86"
helloworld.obj
実行ファイルを動かす。
「Hello World!」と出力された。問題なさそう。
> helloworld.exe
Hello World!
非常に面倒だった。やはりおすすめできない。
参考
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事にコメントをしてみませんか?