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. 实战区别(超级重要)
- 64 位程序不能调用 32 位库,32 位也不能调用 64 位库
→ 版本不匹配直接链接失败! - 64 位内存上限更大,现代软件几乎都用 x64
- 安装第三方库必须和你的编译器位数一致
- 系统目录不同
- 32 位:
C:\Windows\SysWOW64 - 64 位:
C:\Windows\System32
- 32 位:
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
五、极简总结(背会就不会踩坑)
- Windows 编译器:MSVC(cl)、MinGW-w64(gcc)、Clang
- 位数:x86=32位,x64=64位,绝对不能混用
- 库类型:
- 静态库:
.lib/.a→ 打包进 exe - 动态库:
.dll/.so→ 运行时需要
- 静态库:
- 不能混用:编译器、位数、Debug/Release、运行时库
- MinGW:等于 Windows 上的 GCC,轻量好用