MSVC v14.52 Preview更新ガイド|C1001・C1116修正とLNK4321対処【2026年7月】

MSVCのC++ Modulesビルドでfatal error C1001C1116が発生している場合、更新先はMSVC v14.52 Previewのcl.exe 19.52.36520以上、link.exe 14.52.36520以上です。

Microsoftは2026年7月のMSVC Build Tools Preview更新で、サードパーティ製ヘッダーをインクルードした後に、import std;を使用して構築したパーティション付きC++23モジュールをインポートするとC1001やC1116が発生する回帰問題を修正しました。Visual Studio InstallerでPreviewコンポーネントを追加しただけでは不十分で、プロジェクト側でもPreviewを有効化し、実際に使われているcl.exelink.exeのバージョンを確認してからクリーンビルドする必要があります。(Microsoft for Developers)

一方、LNK4321は同じ更新で追加された新しいリンカー警告です。更新によって消える不具合ではなく、重複したC++モジュールのエクスポートを検出するための診断です。LNK4321が出た場合は、古い中間生成物を削除したうえで、モジュールやライブラリが重複してリンクされていないかを調べます。

目次

結論:必要なMSVCバージョンは19.52.36520/14.52.36520以上

今回の修正が含まれる最低バージョンは次のとおりです。単に「v14.52」と表示されているだけで判断せず、実行ファイルが出力する完全なバージョン番号を確認してください。(Microsoft for Developers)

確認項目必要なバージョン判定基準
MSVC Build Toolsv14.52 PreviewPreview版であること
cl.exe19.52.36520以上C1001/C1116の修正を含む
link.exe14.52.36520以上July 2026 Previewのリンカーを使用
Visual StudioVisual Studio 2026StableまたはInsidersからPreviewを導入
ビルド方式MSBuild、CMake、コマンドライン実際にPreviewツールを選択する必要あり

MSVCでは、製品名、コンパイラ、リンカーで番号の先頭が異なります。

  • MSVC Build Toolsの系列:v14.52
  • C/C++コンパイラ:19.52.36520
  • リンカー:14.52.36520

この違いは正常です。cl.exeが19.52、link.exeが14.52であること自体は、ツールの混在を意味しません。

ただし、次のように末尾のビルド番号が一致しない場合は注意が必要です。

実際のバージョン判定
cl 19.52.36520/link 14.52.36520修正版の最低条件を満たす
cl 19.52.36521/link 14.52.36521より新しいビルドなので対象
cl 19.51.x/link 14.51.x修正版ではない
cl 19.52.36519/link 14.52.36519最低ビルド未満のため対象外
cl 19.52.36520/link 14.51.xPATHやプロジェクト設定が混在している可能性が高い

MSVC v14.52 Previewで修正されたC1001・C1116の原因

Microsoftが修正済みとしたのは、すべてのC1001やC1116ではありません。対象となるのは、C++23 Modulesの特定条件で発生していた回帰問題です。

主な条件は次の組み合わせです。

  • パーティション付きのC++23モジュールを使用している
  • そのモジュールがimport std;を使用している
  • インポート側で先にサードパーティ製ヘッダーを#includeしている
  • その後に対象モジュールをimportするとC1001またはC1116が発生する

概念的には、次のような構成です。

// mymodule-part.ixx
export module mymodule:core;

import std;

export int calculate();
// app.cpp
#include <third_party/header.hpp>

import mymodule;

int main()
{
    return calculate();
}

2026年7月のPreview更新では、この条件で発生するfatal error C1001C1116の回帰が修正されています。(Microsoft for Developers)

C1001が残る場合は別の内部コンパイラエラーも疑う

C1001は、特定のモジュール問題だけに使われるエラー番号ではありません。Microsoft Learnでは、C1001を内部コンパイラエラーとして説明しており、構文解析、最適化、特定の式とコンパイルオプションの組み合わせなど、複数の原因で発生する可能性があります。(Microsoft Learn)

そのため、19.52.36520以上へ更新して完全なクリーンビルドを行ってもC1001が残る場合は、次の順序で切り分けます。

  1. エラーがC++ Modulesのインポート処理で発生しているか確認する
  2. ビルドログに表示されたcl.exeの絶対パスを確認する
  3. DebugとReleaseの両方で発生するか確認する
  4. /O2などの最適化を一時的に外して変化を見る
  5. 最小構成の再現コードを作成する
  6. 修正版でも再現する場合はVisual Studio Developer Communityへ報告する

ソースコードの書き換えや最適化の無効化は、更新できない環境での一時回避策です。今回の既知のモジュール回帰に該当する場合は、先にMSVC v14.52 Previewへ更新する方が適切です。

LNK4321は「修正されたエラー」ではなく新しい重複検出警告

LNK4321は、2026年7月のMSVC v14.52 Previewで新たに追加されたリンカー警告です。1つのインポートライブラリ内に、重複したC++モジュールのエクスポートが含まれている状態を診断します。(Microsoft for Developers)

つまり、C1001やC1116とは対処が異なります。

識別子July 2026更新での扱い基本的な対処
C1001特定のC++ Modules回帰を修正19.52.36520以上へ更新
C1116同じモジュール回帰を修正19.52.36520以上へ更新
LNK4321新しい警告を追加重複したモジュールエクスポートを除去

MSVCを更新した直後にLNK4321が初めて表示された場合、更新によって重複が作られたとは限りません。以前から存在していた重複構成が、新しいリンカーによって検出されるようになった可能性があります。

LNK4321が出たときに確認する項目

最初に古い中間生成物をすべて削除します。クリーンビルド後もLNK4321が残る場合は、次の構成を確認してください。

  • 同じ.ixxファイルを複数のプロジェクトでコンパイルしていないか
  • 同じモジュールインターフェイスを複数のオブジェクトファイルに含めていないか
  • 同一の.obj.libをリンク入力へ重複登録していないか
  • プロジェクト参照と「追加の依存ファイル」の両方から同じライブラリを渡していないか
  • 古いツールセットで生成したモジュール成果物が残っていないか
  • Debug用とRelease用の中間ディレクトリを共有していないか
  • x64、x86、ARM64の中間生成物が同じ出力先へ混在していないか

DLLやインポートライブラリを生成しているプロジェクトでは、リンクコマンドの入力一覧も確認します。Visual Studioのビルド出力を「詳細」または「診断」に変更すると、実際に渡されたライブラリやオブジェクトファイルを追いやすくなります。

リンカーには特定の警告を抑制する/IGNOREオプションがありますが、警告を非表示にしても重複したモジュール構成は修正されません。LNK4321は、原因を確認せずに抑制するのではなく、重複入力を解消することが基本です。(Microsoft Learn)

Visual Studio InstallerでMSVC v14.52 Previewへ更新する手順

Visual StudioまたはBuild Toolsのインスタンスを更新する

  1. Visual Studioと実行中のビルドプロセスを終了します。
  2. Visual Studio Installerを起動します。
  3. 使用しているVisual Studio 2026またはBuild Tools for Visual Studio 2026のインスタンスを確認します。
  4. 更新が表示されている場合は、先にインスタンスを最新版へ更新します。
  5. 対象インスタンスの「変更」を開きます。
  6. 「C++によるデスクトップ開発」ワークロードを選択します。
  7. 必要なPreviewコンポーネントを選択します。
  8. 変更を適用してインストールを完了します。

選択するコンポーネントは、ビルド対象のアーキテクチャによって異なります。

ビルド対象選択するコンポーネント
x64/x86MSVC Build Tools for x64/x86 (Preview)
ARM64/ARM64ECMSVC Build Tools for ARM64/ARM64EC (Preview)
複数アーキテクチャ両方を選択

これらのコンポーネントは、ワークロード画面の右側だけでなく、「個別のコンポーネント」でpreviewを検索して選択することもできます。MFC、ATL、C++/CLI、Spectre軽減ライブラリを使用しているプロジェクトでは、Previewに対応した関連コンポーネントも必要です。コマンドライン専用環境では、Visual Studio IDEではなくBuild Tools 2026へ同じコンポーネントを追加できます。(Aka.ms)

Stableで必要なビルドが見つからない場合

MSVC Build Tools Previewは、Visual Studio 2026のStable ChannelとInsiders Channelの両方から利用できます。ただし、Insidersの方がPreview更新を早く受け取り、Microsoftはおおむね週単位で更新されると説明しています。(Microsoft for Developers)

Stable ChannelへPreviewを追加してもcl.exeが19.52.36520未満の場合は、次のどちらかを選びます。

  • Stable Channelで新しいPreviewが提供されるまで待つ
  • 検証用にInsiders Channelまたは対応する最新Build Toolsを導入する

重要なのはチャネル名ではなく、最終的にcl.exelink.exeが最低バージョンを満たしていることです。

プロジェクトをMSVC Previewへ切り替える

Previewコンポーネントをインストールしても、既存プロジェクトが自動的にPreviewへ切り替わるとは限りません。Visual Studioには複数世代のMSVCをサイドバイサイドで導入できるため、プロジェクト設定やコマンドプロンプトが旧バージョンを選んでいる場合があります。

MSBuildプロジェクトの場合

Visual Studioのソリューションエクスプローラーから、対象プロジェクトのプロパティを開きます。

  1. 「構成」をRelease、Debug、または「すべての構成」に設定します。
  2. 「プラットフォーム」をx64、x86、ARM64、または「すべてのプラットフォーム」に設定します。
  3. 「構成プロパティ」から「全般」を開きます。
  4. 「Use MSVC Build Tools Preview」をYesにします。
  5. 「MSVC Build Tools Version」をLatest supportedにします。
  6. すべてのC++プロジェクトで同じ設定を確認します。

MSVC Build Tools Versionに特定のバージョンを固定していると、Previewを有効化しても固定されたMSVCが優先されます。Microsoftも、Previewを利用する場合はLatest supportedへ設定するよう案内しています。(Aka.ms)

コマンドラインからMSBuildを実行する場合は、次のプロパティを指定できます。

msbuild MySolution.sln /m /p:Configuration=Release /p:Platform=x64 /p:MSVCPreviewEnabled=true

CIでは、プロジェクトファイル側の設定だけに依存せず、パイプラインからMSVCPreviewEnabled=trueを明示すると設定漏れを発見しやすくなります。

Developer Command PromptやBuild Toolsの場合

Preview用の環境を初期化してからビルドします。

call "<VS-install-dir>\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=Preview

x86やARM64向けの場合は、対象アーキテクチャに合ったvcvarsスクリプトを使用します。

インストール先やPreviewのフォルダ名は更新によって変わる可能性があります。現在のPreviewツールセットのフォルダ名は、次のファイルで確認できます。(Aka.ms)

<VS-install-dir>\VC\Auxiliary\Build\Microsoft.VCToolsVersion.Preview.txt

CMakeプロジェクトの場合

CMakeでは、Previewをインストールしただけで既存のビルドディレクトリが新しいコンパイラへ切り替わるとは限りません。CMakeCache.txtに以前のコンパイラパスが保存されているためです。

Visual Studioジェネレーターを使用する場合は、CMakePresets.jsontoolsetでMSVCバージョンを明示します。Visual Studio 2026のプラットフォームツールセットはv145ですが、v145という表示だけでは19.52.36520以上を使用しているか判断できません。最終的にはビルドログと実行ファイルのバージョンを確認します。(Aka.ms)

Ninjaなど、環境変数からコンパイラを取得するジェネレーターでは、Preview用のvcvarsを実行した新しいコマンドプロンプトから構成し直します。

call "<VS-install-dir>\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=Preview

cmake -S . -B build -G Ninja
cmake --build build

既存のbuildディレクトリをそのまま再利用せず、後述するクリーン手順を実施してください。

cl.exeとlink.exeのバージョンを確認する

更新後は、新しいDeveloper Command Promptまたはターミナルを開きます。更新前から開いていたターミナルには古いPATHが残っている可能性があります。

最初に、実行されるファイルの場所を確認します。

where cl
where link

複数のパスが表示された場合、通常は先頭の実行ファイルが使われます。Visual Studio 2022、Visual Studio 2026 Stable、Insiders、Build Toolsが同居している環境では、想定外のパスが先頭になっていないか確認してください。

続いてバージョンを確認します。

cl /Bv
link /?

判定基準は次のとおりです。

cl.exe   : 19.52.36520 以上
link.exe : 14.52.36520 以上

cl.exeだけが条件を満たし、link.exeが古い場合は、コンパイラとリンカーが別のインストール先から読み込まれています。vcvarsを実行し直し、where clwhere linkの先頭パスをそろえてください。

Visual Studio上のビルドでは、出力ウィンドウを「詳細」に変更し、実際に呼び出されたcl.exelink.exeの絶対パスも確認します。IDE内のターミナルで確認したバージョンと、プロジェクトビルドが使用するバージョンが同じとは限りません。

更新後はC++ Modulesの成果物を含めてクリーンビルドする

MSVCを更新した後に通常の差分ビルドだけを実行すると、旧コンパイラで生成されたモジュール成果物やオブジェクトファイルが再利用される可能性があります。

特に削除対象となるのは次のファイルです。

  • .ifc
  • .obj
  • .pch
  • .lib
  • .exp
  • .pdb
  • CMakeのCMakeCache.txt
  • モジュールやヘッダーユニットのキャッシュ
  • プロジェクトで設定した中間ディレクトリの内容

Visual Studio/MSBuildでの手順

  1. 「ビルド」から「ソリューションのクリーン」を実行します。
  2. Visual Studioを終了します。
  3. 各プロジェクトの中間ディレクトリと出力ディレクトリを削除します。
  4. .ifcの出力先を独自指定している場合は、そのディレクトリも削除します。
  5. Visual Studioを再起動します。
  6. Previewが有効になっていることを確認します。
  7. ソリューション全体をリビルドします。

「ソリューションのクリーン」だけでは、独自に配置したモジュールキャッシュや外部ビルドシステムの成果物が残る場合があります。C1001やC1116の再検証では、モジュール依存グラフ全体を作り直すことが重要です。

CMakeでの手順

CMakeでは、ツールチェーンを変更するときにビルドディレクトリを作り直す方が確実です。

rmdir /s /q build

call "<VS-install-dir>\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=Preview

cmake -S . -B build -G Ninja
cmake --build build

ビルドディレクトリに手動作成したファイルがある場合は、削除前に退避してください。ソースディレクトリやパッケージ管理用キャッシュまで一括削除する必要はありません。

CIでもキャッシュを無効化する

開発者PCだけを更新しても、CIエージェントが旧MSVCを使っていれば同じエラーが続きます。

CIでは次の対応が必要です。

  • すべてのWindowsビルドエージェントへPreviewを導入する
  • パイプラインの先頭でcl /Bvlink /?を記録する
  • コンパイラバージョンをビルドキャッシュのキーへ含める
  • 旧バージョンで作成したIFCやオブジェクトキャッシュを破棄する
  • Release、Debug、x64、ARM64ごとに中間ディレクトリを分離する
  • ローカルとCIで同じプロジェクトプロパティを使用する

たとえば、キャッシュキーにmsvc-19.52.36520-x64-releaseのような識別子を含めると、旧コンパイラの成果物が再利用されにくくなります。

更新しても直らない場合のチェックリスト

症状主な原因対処
cl.exeが19.51以前Previewが選択されていないプロジェクトのPreview設定とPATHを確認
Installerでは導入済みなのに旧版が動くバージョン固定または古いターミナルLatest supportedへ変更し、ターミナルを開き直す
Debugでは直るがReleaseで再発構成ごとの設定漏れ、最適化依存Release側のPreview設定とビルドログを確認
一部プロジェクトだけC1116になるプロジェクト単位の設定差すべてのC++プロジェクトを確認
クリーン後も同じC1001が出る今回とは別の内部コンパイラエラー最小再現、最適化切り分け、問題報告
LNK4321が残る実際にモジュールエクスポートが重複.ixx.obj.libの重複入力を除去
ローカルでは成功しCIで失敗CIのBuild Toolsが古いエージェント更新とバージョンログ追加
毎回結果が変わる異なるMSVCやキャッシュが混在ツールパスと中間ディレクトリを固定

特に見落としやすいのは、ソリューション内の一部プロジェクトだけが古いMSVCへ固定されているケースです。モジュールを生成するプロジェクトと、モジュールを利用するプロジェクトの両方で同じツールセットを使用してください。

Previewを本番ビルドへ採用するときの注意点

MSVC Build Tools Previewは、不具合修正を早期に検証できる一方、正式な安定版とは運用条件が異なります。

Microsoftは、Previewビルドにはサービス更新が提供されず、本番環境での利用を想定していないと説明しています。また、PreviewはVisual Studioの更新に合わせて新しいビルドへ切り替わり、特定ビルドの固定を前提としていません。(Aka.ms)

実務では、次の運用が安全です。

  • まず専用ブランチや検証用CIで導入する
  • コンパイラとリンカーの完全なバージョンをログへ残す
  • 既存の単体テスト、結合テスト、性能テストを実行する
  • 生成物を正式リリースへ使うかは組織のサポート方針に基づいて判断する
  • 修正がGA版へ入った後は、サポート対象の安定版へ移行する
  • Previewの自動更新によるビルド差分を監視する

C1001やC1116で開発が停止している場合、v14.52 Previewは有効な検証・回避手段です。ただし、Previewでビルドが通ったことだけで本番採用を決めず、実行時の回帰テストまで行う必要があります。

最終的に行うべき対応

C++ Modules環境で今回のC1001またはC1116が発生している場合は、次の順序で対応します。

  1. Visual Studio InstallerでMSVC v14.52 Previewを導入する
  2. x64/x86またはARM64/ARM64EC用のPreviewコンポーネントを選択する
  3. プロジェクトで「Use MSVC Build Tools Preview」を有効にする
  4. cl.exeが19.52.36520以上か確認する
  5. link.exeが14.52.36520以上か確認する
  6. IFC、OBJ、PCH、CMakeキャッシュを含めてクリーンビルドする
  7. C1001/C1116が解消したか確認する
  8. LNK4321が出た場合は、重複したモジュールエクスポートを調査する
  9. CIでも同じMSVCバージョンを使用する
  10. 正式リリース用途ではPreviewのサポート条件を考慮する

最低条件である19.52.36520/14.52.36520を満たしていても、古いモジュール成果物や別プロジェクトのツールセットが混在していると、修正効果を正しく確認できません。更新、ツール選択、バージョン確認、完全な再ビルドを一連の作業として実施することが、最も確実な解決方法です。

この記事を書いた人

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

コメント

コメントする

目次