Visual Studio 2022 開発者コマンドプロンプトで float.h が見つからない(C1083)原因と解決策

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>, cfloatMSVC ToolsetC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.xx\include
Cランタイム(UCRT)のヘッダーfloat.h, stdio.h, stdlib.hWindows SDK(UCRT)C:\Program Files (x86)\Windows Kits\10\Include\<SDKバージョン>\ucrt
Win32 API等のヘッダーWindows.h, winuser.hWindows 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.%
見る項目入っていてほしいもの入っていないと起きやすい症状
INCLUDEMSVCのinclude、UCRT(...\Include\...\ucrt)、Windows SDK(um/shared/winrt等)float.h、stdio.h、Windows.hが見つからない
LIBMSVCの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 SDKWindows 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 clDeveloper 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.hVS InstallerでSDKを追加、修復
x86/x64環境の取り違え後でリンクや実行時に別の問題が出るclの表示x64 Native Tools、vcvars64.batを使う

まとめ:この順でやると解決が早い

  1. 「Developer Command Prompt / x64 Native Tools」を起動し直し、where clとecho %VSCMD_VER%で初期化を確認する
  2. set INCLUDEを確認し、...Windows Kits...\Include...\ucrtが入っているかを見る
  3. 入っていなければVsDevCmd.batまたはvcvars64.batを明示的に実行してから再ビルドする
  4. float.hの実体を検索し、見つからない場合はVisual Studio InstallerでWindows SDKを追加/修復する
  5. 最後にcl /showIncludesで探索状況を確認し、ビルド手順(バッチ/CMake等)を「必ずVS環境を読み込む」形に固定して再発を防ぐ

IDEでは通るのにコマンドラインだけ壊れる問題は、再発防止の観点でも「環境変数を手でいじり続ける」のではなく、VSが用意する初期化スクリプト(VsDevCmd/vcvars)に寄せるのが最も安全です。ここまでの手順で、float.h問題だけでなく、同系統の「標準ヘッダーが見つからない」「SDKのlibが見つからない」トラブルもまとめて解消できます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次