Visual Studio 2022ではIDEのビルドが成功するのに、Developer Command Promptでclを実行すると「float.h が見つからない(fatal error C1083)」で止まることがあります。原因は多くの場合、UCRT/Windows SDK への参照パス(INCLUDEなど)が正しく設定されていないこと。本記事では確認ポイントと復旧手順を整理します。
症状:IDEでは通るのに、開発者コマンドプロンプトでだけ落ちる
今回のパターンは、次のような状況で発生しがちです。
- Visual Studio 2022 Community のIDE上で「ビルド」すると正常に通る
- しかし「Developer Command Prompt for VS 2022」で同じソースを
cl main.cppすると失敗する - エラーは
cfloat(10): fatal error C1083: cannot open include file: 'float.h': No such file or directoryのように、<cfloat>→<float.h>の解決で落ちる(表示言語が混ざるのはOS/ロケール差でよくあります)
ポイントは「IDEで通る=コンパイラ一式が壊れているとは限らない」という点です。むしろ、コマンドプロンプト側の環境設定(特にINCLUDE/LIB/LIBPATH)がIDEと一致していないことが根本原因になりやすいです。
前提知識:float.h はMSVC本体ではなくUCRT側のヘッダー
C++の標準ヘッダー<cfloat>は、処理系によって内部でCのヘッダー<float.h>を取り込む実装になっていることが多いです。MSVCでも同様で、cfloat自体はMSVCのインクルード(例:...\VC\Tools\MSVC\14.xx\include)にあります。
一方で、float.hはUCRT(Universal C Runtime)のヘッダーとして提供されるのが一般的で、典型的にはWindows SDK(Windows Kits)配下にあります。つまり「MSVCのincludeにfloat.hが無い」こと自体は珍しくありません。
| 役割 | 代表例 | 提供元 | 典型的な配置場所(例) |
|---|---|---|---|
| MSVCのC/C++ヘッダー | <vector>, <string>, cfloat | MSVC Toolset | C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.xx\include |
| Cランタイム(UCRT)のヘッダー | float.h, stdio.h, stdlib.h | Windows SDK(UCRT) | C:\Program Files (x86)\Windows Kits\10\Include\<SDKバージョン>\ucrt |
| Win32 API等のヘッダー | Windows.h, winuser.h | Windows SDK | ...\Include\<SDKバージョン>\um / shared |
最優先チェック:本当に「Developer Command Prompt」を開けているか
まず、普通のcmd/PowerShellを開いているだけだと、VSが用意する環境変数がセットされません。似たショートカットが多いので、C++なら次のいずれかから起動するのが安全です。
- Developer Command Prompt for VS 2022
- x64 Native Tools Command Prompt for VS 2022(64bitビルド推奨)
- Developer PowerShell for VS 2022
起動後、次のコマンドで「VS用に初期化済みか」を確認します。
where cl
cl
echo %VSCMD_VER%
echo %VCToolsInstallDir%
echo %WindowsSdkDir%
echo %UniversalCRTSdkDir%
確認の目安は次の通りです。
where clが Visual Studio 配下(...\VC\Tools\MSVC\...)を指す%VSCMD_VER%に何らかのバージョン値が入っている(空なら未初期化の可能性が高い)%VCToolsInstallDir%や%WindowsSdkDir%が空でない
原因の切り分け:INCLUDE / LIB / LIBPATH を見える化する
今回のエラーは「ヘッダーが見つからない」ので、まずはINCLUDEを疑います。Developer Command Promptで次を実行してください。
set INCLUDE
set LIB
set LIBPATH
値が長くて見づらい場合は、区切り(セミコロン)ごとに改行して確認します。
echo %INCLUDE:;=&echo.%
| 見る項目 | 入っていてほしいもの | 入っていないと起きやすい症状 |
|---|---|---|
INCLUDE | MSVCのinclude、UCRT(...\Include\...\ucrt)、Windows SDK(um/shared/winrt等) | float.h、stdio.h、Windows.hが見つからない |
LIB | MSVCのlib、UCRT/Windows SDKのLib | リンク時にkernel32.lib等が見つからない |
LIBPATH | .NET/WinRTなど追加の参照パス(環境により異なる) | 特定のプロジェクトでのみリンクが崩れる |
最短で直す:VsDevCmd / vcvars を明示的に実行して環境を作り直す
「Developer Command Promptなのに環境が崩れている」場合でも、VSの環境初期化スクリプトを明示的に叩くと復旧することがあります。インストール先が既定のままなら、次のいずれかを実行してください(パスは環境で変わります)。
VsDevCmd.bat を使う
"C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat"
実行後に、改めてコンパイルします。
cd /d C:\Users\TannicArcher\Desktop\Program
cl main.cpp
vcvars64.bat(x64向け)を使う
"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
cd /d C:\Users\TannicArcher\Desktop\Program
cl main.cpp
ここでエラーが消えるなら、ほぼ確実に「起動していたプロンプトが未初期化だった」か「初期化が途中で失敗していた」ことが原因です。
複数のVisual Studioがある場合:vswhereで正しいインストール先を特定する
PCにCommunity/Build Tools/Previewなど複数のVSが入っていると、意図しない環境が立ち上がることがあります。次のコマンドで「最新のVSのインストール先」を取得できます(既定の場所にあります)。
"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -property installationPath
出力されたパス(例:C:\Program Files\Microsoft Visual Studio\2022\Community)を使って、次のようにVsDevCmd.batを呼び出すと確実です。
for /f "usebackq delims=" %i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -property installationPath`) do call "%i\Common7\Tools\VsDevCmd.bat" -arch=x64 -host_arch=x64
cl
バッチファイル内で書く場合は、%iを%%iに置き換えてください。
ヘッダーの実体確認:float.h がどこにあるか探す
「本当にPCにfloat.hが無いのか」「あるのにINCLUDEが届いていないのか」を切り分けるため、ファイルの実在を確認します。一般的には Windows SDK(Windows Kits)配下にあります。
dir /s /b "C:\Program Files (x86)\Windows Kits\10\Include\*\ucrt\float.h"
PowerShellが使える場合は次の方が見つけやすいこともあります。
Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\Include" -Recurse -Filter float.h -ErrorAction SilentlyContinue
見つかったパスが例えば次のような形なら正常です(SDKバージョン部分は環境依存です)。
C:\Program Files (x86)\Windows Kits\10\Include\10.0.xxxxx.x\ucrt\float.h
ここで見つかったのにコンパイルで見つからない場合は、やはりINCLUDEにこのディレクトリが入っていないことが原因です。
INCLUDEを一時的に補って検証する
恒久対策は後述しますが、原因確認として「UCRTのパスを足したら直るか」を試すのは有効です。まず、SDKのバージョンフォルダー名を確認してください(例:10.0.22621.0など)。その上で、次のように一時的にINCLUDEを追加します。
set "SDKVER=10.0.xxxxx.x"
set "INCLUDE=C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\include;C:\Program Files (x86)\Windows Kits\10\Include\%SDKVER%\ucrt;%INCLUDE%"
cl main.cpp
これでエラーが消えるなら、「本体のヘッダー欠損ではなく、探索パス不足が原因」とほぼ断定できます。なお、実運用ではバージョン固定のベタ書きは避け、VsDevCmd.bat等が設定する環境変数(UniversalCRTSdkDir, UCRTVersion, WindowsSdkDir, WindowsSDKVersionなど)を使うのが安全です。
環境が整っているかの追加確認:cl /Bv と /showIncludes
次の2つは「今どのツールセットを使っているのか」「インクルード探索がどこで切れているのか」を把握するのに役立ちます。
コンパイラ情報を出す
cl /Bv
インクルード解決のログを見る
cl /nologo /showIncludes main.cpp
float.hが見つからない環境では、cfloatまでは解決できても、その先で止まるはずです。どのディレクトリを参照しているかが出力されるので、原因箇所の特定が早くなります。
恒久対策:環境変数を手で固定しない
Windowsの「環境変数(システム/ユーザー)」にINCLUDEを恒久設定してしまうと、SDK更新やVS更新でパスがズレた瞬間に再発します。おすすめは次のいずれかです。
- 毎回「x64 Native Tools Command Prompt for VS 2022」からビルドする
- ビルド用バッチを作り、その先頭で
VsDevCmd.batまたはvcvars64.batを呼ぶ - CMake / Ninjaを使う場合は、VSのジェネレーターやCMake PresetsでVSツールセットを正しく選ぶ
例:ビルド用のbuild.batを作り、必ずVS環境を読み込んでからコンパイルします(パスは環境に合わせてください)。
@echo off
call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat" -arch=x64 -host_arch=x64
cd /d "%~dp0"
cl main.cpp
Visual Studio Installer で確認すべきインストール構成
環境変数が直らない、またはfloat.h自体が見つからない場合は、コンポーネント不足や破損を疑います。Visual Studio Installerを開き、次をチェックしてください。
| チェック項目 | 推奨状態 | 理由 |
|---|---|---|
| ワークロード | 「C++ によるデスクトップ開発」が有効 | MSVCコンパイラ、標準ライブラリ、基本ツールが揃う |
| MSVCツールセット | MSVC v143(VS 2022) | clやlinkの本体 |
| Windows SDK | Windows 10/11 SDK のいずれかが有効 | UCRT(float.h等)やWin32ヘッダー/ライブラリが入る |
| 修復 | 変更 → 修復を実施 | ファイル破損や不整合をまとめて直せる |
「インストールされているはずなのに見つからない」場合でも、SDKの追加・修復で直るケースが少なくありません。特にWindows SDKはバージョンが複数共存することがあり、古いものだけが残っている/新しいものが壊れている、といった状態も起こりえます。
devenv /ResetSettings はどこまで効くのか
devenv /ResetSettingsはVisual Studio本体の設定(UI/キーバインド等)を初期化します。IDEの挙動がおかしい、ツールセットの選択が変になった、などの症状には有効です。
ただし今回のようにコマンドラインのINCLUDEが欠けている問題の本丸は「VsDevCmd/vcvarsが正しく走っているか」「Windows SDK(UCRT)が入っているか」です。リセットは「試してもよいが、優先度は高くない」位置づけになります。
応急処置:float.h をコピーするのが非推奨な理由
「どこかにあるfloat.hをMSVCのinclude直下にコピーする」方法は、動作確認としては手っ取り早く見えます。しかし、次の理由でおすすめしません。
- SDKとMSVCの想定バージョンがズレると、宣言の差分で別のエラーを生む可能性がある
- Visual StudioやWindows SDKの更新で上書き/消失し、再発しやすい
- 本質原因(INCLUDE不整合)を放置するため、次は別のヘッダーで同様の問題が起きる
よくある落とし穴
| 落とし穴 | 症状 | 確認コマンド | 対処 |
|---|---|---|---|
| 普通のcmd/PowerShellを開いている | VSCMD_VERが空、clが見つからない/別物 | echo %VSCMD_VER%, where cl | Developer Command Prompt / x64 Native Tools から開き直す |
| PATHに古いVSやBuild Toolsが混ざる | 違うclが先にヒットする | where cl(複数行出る) | 必要ならVsDevCmd.batを明示実行、不要なPATHを整理 |
| Windows SDKが未導入/壊れている | float.h自体がPCに無い | dir /s /b ...\Windows Kits\10\Include\*\ucrt\float.h | VS InstallerでSDKを追加、修復 |
| x86/x64環境の取り違え | 後でリンクや実行時に別の問題が出る | clの表示 | x64 Native Tools、vcvars64.batを使う |
まとめ:この順でやると解決が早い
- 「Developer Command Prompt / x64 Native Tools」を起動し直し、
where clとecho %VSCMD_VER%で初期化を確認する set INCLUDEを確認し、...Windows Kits...\Include...\ucrtが入っているかを見る- 入っていなければ
VsDevCmd.batまたはvcvars64.batを明示的に実行してから再ビルドする float.hの実体を検索し、見つからない場合はVisual Studio InstallerでWindows SDKを追加/修復する- 最後に
cl /showIncludesで探索状況を確認し、ビルド手順(バッチ/CMake等)を「必ずVS環境を読み込む」形に固定して再発を防ぐ
IDEでは通るのにコマンドラインだけ壊れる問題は、再発防止の観点でも「環境変数を手でいじり続ける」のではなく、VSが用意する初期化スクリプト(VsDevCmd/vcvars)に寄せるのが最も安全です。ここまでの手順で、float.h問題だけでなく、同系統の「標準ヘッダーが見つからない」「SDKのlibが見つからない」トラブルもまとめて解消できます。

コメント