在 Linux 下用 C++ 做跨平台编译,通常目标是:
一份代码,能在 Linux / Windows / macOS 上编译运行。
下面从「思路 → 工具 → 示例」系统讲一下。
跨平台 ≠ 换系统重写,而是:
✅ 推荐:
#include <iostream>
#include <filesystem>
#include <thread>
❌ 避免:
#include <windows.h>
#include <unistd.h> // 直接用
#ifdef _WIN32
// Windows
#elif __linux__
// Linux
#elif __APPLE__
// macOS
#endif
常见宏:
| 宏 | 平台 |
|---|---|
_WIN32 |
Windows |
__linux__ |
Linux |
__APPLE__ |
macOS |
| 功能 | 库 |
|---|---|
| 网络 | Boost.Asio / libcurl |
| 文件 | std::filesystem |
| 线程 | std::thread |
| GUI | Qt / SDL / wxWidgets |
| 日志 | spdlog |
cmake_minimum_required(VERSION 3.10)
project(demo)
add_executable(demo main.cpp)
mkdir build
cd build
cmake ..
make
在 Windows 上:
cmake .. -G "Visual Studio 17 2022"
✅ 最简单、最少坑
sudo apt install mingw-w64
x86_64-w64-mingw32-g++ main.cpp -o app.exe
CMake:
cmake .. -DCMAKE_TOOLCHAIN_FILE=mingw.cmake
sudo apt install gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-g++ main.cpp
使用:
示例(GitHub Actions):
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- run: cmake -B build
- run: cmake --build build
❌ 路径分隔符
#ifdef _WIN32
#define PATH_SEP '\\'
#else
#define PATH_SEP '/'
#endif
❌ 行尾符
❌ 字节对齐
❌ 动态库后缀 .so / .dll / .dylib
✅ 新手推荐组合
C++17 + CMake + 标准库 + 条件编译
✅ 进阶
CMake + vcpkg/conan + CI
如果你愿意,可以告诉我:
我可以直接给你一套可用的跨平台模板。