温馨提示×

Linux C++配置跨平台怎么搞

小樊
45
2026-09-11 00:52:42
栏目: 编程语言

在 Linux 下用 C++ 做跨平台(Windows / macOS / Linux)开发,核心目标通常是:

一份代码,尽量少的平台差异,统一构建、统一依赖管理

下面按「实战路线」给你讲清楚怎么搞。


一、先选构建系统(最重要)

✅ 推荐:CMake(事实标准)

跨平台 C++ 首选 CMake,不是 make、不是 autotools。

cmake_minimum_required(VERSION 3.16)
project(MyApp)

add_executable(app main.cpp)

构建方式统一:

mkdir build && cd build
cmake ..
cmake --build .

支持:

  • Linux / Windows(MSVC) / macOS(Clang)
  • Ninja / Make / VS / Xcode

二、编译器差异处理

1️⃣ 编译器宏判断

#if defined(_WIN32)
    // Windows
#elif defined(__APPLE__)
    // macOS
#elif defined(__linux__)
    // Linux
#endif

2️⃣ 标准统一

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

避免:

  • Windows 默认 C++14
  • 老 GCC 默认 C++11

三、平台相关代码隔离(关键)

✅ 推荐结构

src/
 ├── common/
 ├── platform/
 │   ├── linux/
 │   ├── windows/
 │   └── macos/

示例:

// file_utils.h
#ifdef _WIN32
#include "platform/windows/file_utils_win.h"
#else
#include "platform/linux/file_utils_posix.h"
#endif

不要满屏 #ifdef


四、依赖管理(跨平台难点)

✅ 方案 1:vcpkg(Windows/Linux/macOS 都支持)

vcpkg install fmt

CMake 里:

find_package(fmt CONFIG REQUIRED)
target_link_libraries(app fmt::fmt)

✅ 官方推荐(Microsoft)


✅ 方案 2:Conan(更“专业”)

conan install .

适合:

  • 大型项目
  • 多配置(Debug/Release)

❌ 不推荐

  • 手动下载库
  • apt 只装 Linux 依赖

五、文件系统 / 系统 API 跨平台

✅ 用标准库(C++17 起)

#include <filesystem>
namespace fs = std::filesystem;

✅ 跨平台 ❌ 别再用 dirent.h / windows.h


✅ 网络 / 线程

  • 线程:std::thread
  • 原子:std::atomic
  • 网络:暂未进标准 → 用:
    • asio
    • boost::asio
    • libuv

六、字符编码问题(坑最多的地方)

✅ 统一 UTF-8

#include <locale>
std::locale::global(std::locale("en_US.UTF-8"));

Windows 额外:

SetConsoleOutputCP(CP_UTF8);

七、CI 验证跨平台(必须)

GitHub Actions 示例

jobs:
  build:
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]

✅ 不跑 CI = 迟早崩


八、常见跨平台陷阱

问题 解决
路径分隔符 std::filesystem
大小写敏感 Linux 敏感
动态库后缀 .so/.dll/.dylib
线程库 std::thread
编译器警告 -Wall -Wextra

九、最小可落地的跨平台模板

project/
 ├── CMakeLists.txt
 ├── src/
 │   ├── main.cpp
 │   └── platform/
 └── vcpkg.json

十、如果你愿意,我可以继续帮你

你可以告诉我:

  1. 目标平台(Win / Linux / macOS?)
  2. 项目类型(GUI / 服务 / 库 / 游戏?)
  3. 是否用 GUI(Qt / SDL / 原生?)

我可以直接给你一个 可编译的跨平台 CMake 模板

0