Windows C++ 开发容易踩坑、核心的知识点

一、Windows 上除了 VS(cl.exe),还有哪些编译器?

Windows 上能跑的 C++ 编译器一共 4 种,你必须分清:

1. cl.exe (MSVC)

  • 微软官方,Visual Studio 自带
  • Windows 原生、最稳定、生态最好
  • 生成 .lib .dll .exe

2. MinGW / MinGW-w64(你问到的重点)

  • GCC 移植到 Windows
  • 开源免费、轻量、不用装 VS
  • 能生成 win32 原生 exe
  • 生成 .a(静态库)、.dll(动态库)、.exe

注意:
MinGW 只支持 32 位
MinGW-w64 支持 64 位 + 32 位(现在都用这个)

3. Clang / LLVM

  • 微软也集成了 Clang
  • 报错信息清晰、编译快
  • 可以兼容 MSVC 或 MinGW 环境

4. Cygwin

  • 不是原生 Windows,是 Linux 模拟层
  • 不推荐做正式开发,生成的 exe 必须带 cygwin1.dll

二、Windows 开发必懂:x86 vs x64 区别

1. 是什么?

  • x86 = 32 位
  • x64 = 64 位

2. 实战区别(超级重要)

  1. 64 位程序不能调用 32 位库,32 位也不能调用 64 位库
    → 版本不匹配直接链接失败!
  2. 64 位内存上限更大,现代软件几乎都用 x64
  3. 安装第三方库必须和你的编译器位数一致
  4. 系统目录不同
    • 32 位:C:\Windows\SysWOW64
    • 64 位:C:\Windows\System32

3. CMake 怎么指定?

# 生成 64 位 VS 工程
cmake .. -A x64

# 生成 32 位 VS 工程
cmake .. -A Win32

三、静态库 vs 动态库(Windows 最容易懵的点)

1. 静态库(.lib / .a)

  • 编译时直接打包进 exe
  • 发布时只需要一个 exe
  • 优点:简单、无依赖
  • 缺点:exe 体积大
  • Windows:.lib
  • Linux:.a
  • MinGW:.a

2. 动态库(.dll / .so)

  • 运行时加载
  • 发布时必须带上 .dll
  • 优点:多个程序共用、体积小
  • 缺点:缺 dll 就崩溃
  • Windows:.dll + 配套 .lib(导入库)
  • Linux:.so
  • MinGW:.dll + .a

3. Windows 独有的坑:

  • MSVC 的静态库 .lib ≠ 动态库的导入库 .lib
    名字一样,格式完全不同!
  • 动态库必须处理:__declspec(dllexport) / __declspec(dllimport)

四、Windows 开发 5 大必注意知识点(实战必看)

1. 编译器不能混用!

  • MSVC 编译的库 不能 给 MinGW 使用
  • MinGW 编译的库 不能 给 MSVC 使用
  • 32 位 ↔ 64 位 不能混用
  • Debug ↔ Release 不能混用(MSVC)

口诀:同编译器、同位数、同版本、同模式 才能链接

2. 运行时库(CRT)冲突

MSVC 有四种运行时:

  • /MT 静态多线程
  • /MTd 静态调试
  • /MD 动态多线程(默认)
  • /MDd 动态调试

如果库和你的程序使用不同运行时,会直接编译报错

3. 字符集问题

  • Windows 默认:UTF-16(宽字符 wchar_t)
  • Linux/macOS:UTF-8
  • 写跨平台文件/字符串时必须注意

4. 依赖打包

  • MSVC 发布程序可能需要:
    • vcruntimexxx.dll
    • msvcpxxx.dll
  • 解决方案:
    • 使用 /MT 静态打包运行时
    • 或安装 VC 运行时库

5. 路径分隔符

  • Windows:\
  • C++ 字符串要写:\\
  • 跨平台推荐:std::filesystem

五、极简总结(背会就不会踩坑)

  1. Windows 编译器:MSVC(cl)、MinGW-w64(gcc)、Clang
  2. 位数:x86=32位,x64=64位,绝对不能混用
  3. 库类型
    • 静态库:.lib/.a → 打包进 exe
    • 动态库:.dll/.so → 运行时需要
  4. 不能混用:编译器、位数、Debug/Release、运行时库
  5. MinGW:等于 Windows 上的 GCC,轻量好用