第二章:跨平台开发环境搭建(Windows、macOS、Linux)
说实话,做跨平台SDK改造,第一道坎往往不是代码怎么写。而是环境怎么搭。
我见过太多新人,一上来就撸代码,结果编译报错一整天。最后发现,是编译器版本没对齐。环境搭建这事儿,看似基础,实则暗坑无数。
今天我就把自己这些年踩过的坑,总结一下。咱们一次性把Windows、macOS、Linux的环境搞定。
2.1 统一开发语言与编译器
要做跨平台,你的编译器首先得跨。我个人习惯用CMake + Clang/GCC这组组合。原因很简单,CMake是事实上的C++构建标准,Clang和GCC在三个平台上都能跑。
| 平台 | 主力编译器 | 构建系统 | 包管理器 |
|---|---|---|---|
| Windows | MSVC / Clang-cl | CMake + Ninja | vcpkg |
| macOS | Apple Clang | CMake + Ninja | Homebrew |
| Linux | GCC / Clang | CMake + Ninja | apt / yum / dnf |
2.2 Windows 环境配置
Windows 这里我最想说的是:Visual Studio 不是必须装完整版。
你可以只装“Build Tools for Visual Studio”。它不带IDE,就光编译器和工具链。体积小,适合CI环境。我在旧项目里用过,效果不错。
# 安装 vcpkg(Windows 示例)
git clone https://github.com/Microsoft/vcpkg.git
.\vcpkg\bootstrap-vcpkg.bat
# 安装常见依赖
.\vcpkg\vcpkg install boost-system:x64-windows
.\vcpkg\vcpkg install fmt:x64-windows
2.3 macOS 环境配置
macOS 这边,Xcode Command Line Tools 是必须装的。但Xcode本身,你不做iOS开发就不用装。用命令装CLT就好:
xcode-select --install
然后你还需要 Homebrew。这个几乎是macOS开发的标配了。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 用 brew 装 cmake 和 ninja
brew install cmake ninja
2.4 Linux 环境配置
Linux 这里最简单的做法,就是直接用系统包管理器装。
# Ubuntu/Debian
sudo apt update
sudo apt install build-essential cmake ninja-build git
# Fedora/RHEL
sudo dnf groupinstall "Development Tools"
sudo dnf install cmake ninja-build git
你想想看,是不是很简单?嗯,但有个坑:系统自带的 GCC 版本往往偏老。
我建议你装较新版本的 GCC。比如用 PPA 或者手动编译。不然会遇到 C++17/20 新特性不支持的问题。
2.5 统一依赖管理
说到底,跨平台最头疼的就是依赖管理。同一套依赖,在三个平台上都得编译一遍。
我个人推荐两种做法:
- vcpkg:微软维护的 C++ 包管理器,三平台都支持。适合 Windows 优先的项目。
- Conan:更灵活的包管理器,适合复杂依赖关系。
2.6 编辑器与调试器
| 编辑器 | 调试器 | 跨平台支持 |
|---|---|---|
| VS Code | lldb / gdb | 三平台原生支持 |
| CLion | 内置调试器 | 三平台原生支持 |
我自己一直用 VS Code。配置好 CMake Tools 和 CodeLLDB 插件后,体验跟 CLion 有得一拼。而且免费,团队推广没阻力。
2.7 跨平台环境搭建核心逻辑
2.8 避坑指南:我踩过的三个坑
-
路径分隔符问题:Windows 用反斜杠
\,macOS/Linux 用正斜杠/。我早期写代码全用硬编码,结果 Linux 上编译不过。后来统一用 CMake 的${CMAKE_SOURCE_DIR}处理路径,再也没出过问题。 -
动态库后缀名:Windows 是 .dll,macOS 是 .dylib,Linux 是 .so。不要混用。我曾经在 CMake 里写死了 .dll,macOS 上链接失败。后来改用
target_link_libraries自动识别后缀。 -
CRT 冲突:Windows 上 Debug/Release 混用会导致堆损坏。这是个经典老坑,我早期在一个金融项目里遇到过,排查了两天才定位到。
解决方案:所有依赖包都保持 Debug/Release 版本一致,且都用动态运行时(MD / MDd)。
2.9 快速验证环境
环境搭好后,写个最小程序验证一下:
#include <iostream>
#include <fmt/core.h>
int main() {
std::cout << "Hello from cross-platform!" << std::endl;
fmt::print("fmt works too!\n");
return 0;
}
用 CMake 构建命令:
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
./build/sample_app
如果能正常输出,恭喜你,环境已经搭建好了。接下来就可以安心做 SDK 兼容性改造工作了。