温馨提示×

Linux C++如何跨平台编译

小樊
50
2026-08-27 11:22:24
栏目: 编程语言

在 Linux 上做 C++ 跨平台编译,核心目标是:
一份源码,能在不同操作系统 / 架构上编译运行(如 Linux / Windows / macOS,x86 / ARM 等)。

下面从 思路 → 工具 → 实践方案 给你一个完整指南。


一、跨平台编译的两种含义

1️⃣ 编译机 ≠ 运行机(交叉编译)

  • Linux 上编译 Windows / ARM / Android 程序
  • 例如:
    • Ubuntu → Windows .exe
    • PC → 树莓派 / 嵌入式设备

2️⃣ 同一份代码,多平台源码级兼容

  • 使用 跨平台代码 + 构建系统
  • 在不同平台各自本地编译

✅ 实际项目中 两者通常结合使用


二、跨平台 C++ 编程原则(先决条件)

✅ 1. 避免平台专有 API

❌ 不推荐:

#include <windows.h>
#include <unistd.h> // 裸用

✅ 推荐:

  • 使用 标准 C++
  • 必须平台差异时:
#ifdef _WIN32
    // Windows
#elif __linux__
    // Linux
#elif __APPLE__
    // macOS
#endif

✅ 2. 使用跨平台库

功能 推荐
文件系统 std::filesystem / boost::filesystem
网络 asio / boost.asio
线程 std::thread
GUI Qt / SDL / wxWidgets
日志 spdlog

三、构建系统(非常关键)

✅ 推荐:CMake(主流)

示例 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(MyApp)

set(CMAKE_CXX_STANDARD 17)

add_executable(myapp main.cpp)

✅ 优点:

  • Windows / Linux / macOS 通用
  • 可配合 交叉编译工具链

四、Linux 上交叉编译(常见场景)


✅ 场景 1:Linux → Windows(最常见)

方法:MinGW-w64

sudo apt install mingw-w64

编译

x86_64-w64-mingw32-g++ main.cpp -o app.exe

CMake 交叉编译

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-mingw.cmake

toolchain 示例:

set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)

✅ 场景 2:Linux → ARM(如树莓派)

sudo apt install gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-g++ main.cpp -o app_arm

✅ 场景 3:Linux → Android

使用 NDK

$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++

五、Docker 跨平台编译(强烈推荐)

✅ 优点

  • 避免“在我机器能跑”
  • CI/CD 友好
  • 容易复现

示例

docker run --rm -v $(pwd):/src ubuntu:22.04 bash /src/build.sh

六、CI 自动多平台编译(进阶)

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 && cmake --build build

✅ 一次提交,三个平台自动编译


七、常见坑 & 建议

❌ 常见错误

问题 原因
编译通过,运行崩溃 动态库不匹配
Windows 中文乱码 编码 / wchar_t
路径问题 / vs \
宏判断混乱 手写太多 #ifdef

✅ 建议

  • 尽量 不写平台判断
  • CMake + 标准库
  • Docker / CI
  • 动态库尽量静态链接(跨平台时)

八、推荐组合(最佳实践)

现代 C++ 跨平台方案

C++17/20
+ CMake
+ 标准库 / 少量第三方库
+ Docker
+ GitHub Actions

九、如果你愿意,我可以进一步帮你

你可以告诉我:

  1. ✅ 目标平台(Windows / ARM / macOS?)
  2. ✅ 是否使用 IDE(CLion / VS / VSCode)
  3. ✅ 是否已有项目结构
  4. ✅ 是否用于嵌入式 / 桌面 / 服务端

我可以直接给你 可用的 CMake + 工具链文件 + 编译命令

0