msvc-cl

MSVC cl.exe and clang-cl

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "msvc-cl" with this command: npx skills add mohitmishra786/low-level-dev-skills/mohitmishra786-low-level-dev-skills-msvc-cl

MSVC cl.exe and clang-cl

Purpose

Guide agents through Windows C/C++ compilation: MSVC cl.exe , clang-cl as MSVC-compatible driver, MSBuild project settings, and runtime library choices.

Triggers

  • "How do I compile with MSVC from the command line?"

  • "What is the MSVC equivalent of -O2 ?"

  • "/MT vs /MD — which do I use?"

  • "How do I use clang-cl instead of cl.exe?"

  • "I'm getting LNK errors on Windows"

  • "How do I generate PDB files?"

Workflow

  1. Set up the environment

MSVC requires the Visual Studio environment variables. Use the Developer Command Prompt or set up manually:

REM x64 native "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"

REM x86 cross (host x64, target x86) "...\vcvarsamd64_x86.bat"

REM Check compiler version cl /?

In CMake, use the "Visual Studio 17 2022" generator or pass -DCMAKE_GENERATOR="Visual Studio 17 2022" .

  1. Flag translation: GCC → MSVC

GCC/Clang MSVC cl.exe Notes

-O0

/Od

Debug, no optimisation

-O1

/O1

Minimise size

-O2

/O2

Maximise speed

-O3

/Ox

Full optimisation

-Os

/Os

Favour size

-g

/Zi

PDB debug info

-g (embedded) /Z7

Debug info in object file

-Wall

/W3 or /W4

Warning level

-Werror

/WX

Warnings as errors

-std=c++17

/std:c++17

Standard selection

-DFOO=1

/DFOO=1

Preprocessor define

-I path

/I path

Include path

-c

/c

Compile only (no link)

-o out

/Fe:out.exe or /Fo:out.obj

Output file

-shared

/LD

Build DLL

-fPIC

(implicit on Windows) Not needed on Windows

-flto

/GL (compile) + /LTCG (link) Whole program optimisation

  1. Runtime library selection

This is the most common source of LNK errors on Windows.

Flag Runtime Use case

/MD

MSVCRT.dll (dynamic) Release, DLL linkage (recommended default)

/MDd

MSVCRTd.dll (debug dynamic) Debug builds

/MT

Static CRT Standalone exe; avoid mixing with DLLs

/MTd

Static CRT debug Debug + static

Rule: All objects and libraries in a link must use the same runtime. Mixing /MT and /MD causes LNK2038: mismatch detected .

  1. clang-cl

clang-cl is Clang's MSVC-compatible driver. It accepts cl.exe -style flags and can replace cl.exe in most MSBuild/CMake projects.

REM Install: part of LLVM Windows release or VS "LLVM" component

REM Basic usage (MSVC-style flags) clang-cl /O2 /std:c++17 /MD src.cpp /Fe:prog.exe

REM Pass Clang-native flags with /clang: clang-cl /O2 /clang:-Rpass=inline src.cpp /Fe:prog.exe

REM Use in CMake cmake -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl ..

Minimum Clang version for MSVC STL compatibility: Clang 8+. For C++20 features with MSVC STL: Clang 14+.

Source: https://learn.microsoft.com/en-us/cpp/build/clang-support-msbuild

  1. PDB files and debugging

REM Compile with /Zi (external PDB) and /Fd (PDB name) cl /Zi /Fd:prog.pdb /O2 src.cpp /link /DEBUG

REM /Z7: debug info embedded in .obj (no separate PDB for objects) cl /Z7 /O2 src.cpp /link /DEBUG /PDB:prog.pdb

For WinDbg or VS debugger, ensure the PDB is alongside the executable or set the symbol path.

  1. Common LNK errors

Error Cause Fix

LNK2019: unresolved external

Missing .lib

Add library in project settings or /link foo.lib

LNK2038: mismatch detected for 'RuntimeLibrary'

Mixed /MT and /MD

Unify all to /MD or /MT

LNK1104: cannot open file 'foo.lib'

Library not in search path Add path via /LIBPATH: or LIB env var

LNK2005: already defined

Multiple definitions Use __declspec(selectany) or check for duplicate definitions

LNK4098: defaultlib 'LIBCMT' conflicts

Runtime mismatch Explicitly pass /NODEFAULTLIB:LIBCMT or unify runtimes

  1. Useful cl.exe flags

REM Preprocessed output cl /P src.cpp # produces src.i

REM Assembly output cl /FA /O2 src.cpp # produces src.asm (MASM syntax) cl /FAs # interleave source + asm

REM Show include files cl /showIncludes src.cpp

REM Compiler version cl /? 2>&1 | findstr /i "version"

For flag details, see references/flags.md.

Related skills

  • Use skills/compilers/clang for clang-cl's Clang-native diagnostics

  • Use skills/build-systems/cmake for CMake toolchain configuration on Windows

  • Use skills/debuggers/lldb or WinDbg for debugging MSVC-built binaries

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

cmake

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

static-analysis

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

llvm

No summary provided by upstream source.

Repository SourceNeeds Review