skills/msvc-cl/SKILL.md
MSVC cl.exe and clang-cl skill for Windows C/C++ projects. Use when configuring Visual Studio builds, MSBuild, or clang-cl as a drop-in MSVC replacement. Covers translating GCC/Clang flags to MSVC equivalents, runtime library selection, Windows SDK setup, and diagnosing MSVC-specific errors. Activates on queries about cl.exe, clang-cl, /O flags, /MT vs /MD, PDB files, Windows ABI, or MSVC project settings.
npx skillsauth add awfixers-stuff/opencode-config msvc-clInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Guide agents through Windows C/C++ compilation: MSVC cl.exe, clang-cl as MSVC-compatible driver, MSBuild project settings, and runtime library choices.
-O2?"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".
| 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 |
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.
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
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.
| 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 |
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.
skills/compilers/clang for clang-cl's Clang-native diagnosticsskills/build-systems/cmake for CMake toolchain configuration on Windowsskills/debuggers/lldb or WinDbg for debugging MSVC-built binariesdevelopment
Use when starting dev servers, watchers, tilt, or any process expected to outlive the conversation. Provides zmx session management patterns for long-lived processes.
development
Zig testing skill for writing and running tests. Use when using zig build test, writing comptime tests, using test filters, working with test allocators to detect leaks, or using Zig's built-in fuzz testing (0.14+). Activates on queries about Zig tests, zig test, zig build test, comptime testing, test allocators, Zig fuzz testing, or detecting memory leaks in Zig tests.
development
Zig debugging skill. Use when debugging Zig programs with GDB or LLDB, interpreting Zig runtime panics, using std.debug.print for tracing, configuring debug builds, or debugging Zig programs in VS Code. Activates on queries about debugging Zig, Zig panics, zig gdb, zig lldb, std.debug.print, Zig stack traces, or Zig error return traces.
tools
Zig cross-compilation skill. Use when cross-compiling Zig programs to different targets, using Zig's built-in cross-compilation for embedded, WASM, Windows, ARM, or using zig cc to cross-compile C code without a system cross-toolchain. Activates on queries about Zig cross-compilation, zig target triples, zig cc cross-compile, Zig embedded targets, or Zig WASM.