温馨提示×

Linux C++怎么跨平台

小樊
34
2026-07-17 08:18:04
栏目: 编程语言

在 Linux 下写 跨平台 C++,核心目标是:同一份代码能在 Linux / Windows / macOS 上编译运行。下面从原则 → 工具 → 实践系统讲一下。


一、核心原则(先记住这 3 条)

  1. 只用标准 C++

    • 尽量使用 C++11 / 14 / 17 / 20 标准特性
    • 避免平台专有 API(如 fork()WinAPI
  2. 通过抽象层屏蔽平台差异

    • 用条件编译或第三方库处理平台差异
  3. 构建系统要跨平台

    • 不要手写 Makefile 只给 Linux 用

二、语言层面:写“标准 C++”

✅ 推荐

#include <iostream>
#include <string>
#include <vector>
#include <filesystem> // C++17

int main() {
    std::string name = "world";
    std::cout << "Hello, " << name << std::endl;
}

❌ 不推荐(不可跨平台)

#include <unistd.h>   // Linux only
#include <windows.h>  // Windows only

三、常见平台差异 & 解决方案

1️⃣ 文件系统

功能 方案
路径 std::filesystem(C++17)
文件操作 std::filesystem
行分隔符 / 统一(Windows 也支持)
#include <filesystem>
namespace fs = std::filesystem;

fs::path p = "data/config.json";
if (fs::exists(p)) {}

2️⃣ 线程 / 并发

✅ 使用:

  • std::thread
  • std::mutex
  • std::condition_variable
#include <thread>

void task() {}
std::thread t(task);
t.join();

3️⃣ 网络(跨平台难点)

方案 说明
asio(推荐) Boost.Asio / standalone asio
sys/socket.h ❌ Linux only
winsock ❌ Windows only
#include <asio.hpp>

4️⃣ 时间 & 定时器

#include <chrono>

auto now = std::chrono::system_clock::now();

四、构建系统(非常重要)

✅ 推荐:CMake

cmake_minimum_required(VERSION 3.16)
project(MyApp)

set(CMAKE_CXX_STANDARD 17)

add_executable(app main.cpp)

优点:

  • Windows / Linux / macOS 通用
  • 配合 VS / CLion / Qt Creator

五、编译器 & 标准支持

平台 编译器
Linux g++ / clang
Windows MSVC / clang-cl
macOS clang

✅ 建议:

-std=c++17 -Wall -Wextra

六、平台差异处理(高级但常用)

1️⃣ 条件编译(谨慎用)

#ifdef _WIN32
    // Windows
#elif __linux__
    // Linux
#elif __APPLE__
    // macOS
#endif

只放在最底层封装中


2️⃣ 抽象平台差异(推荐)

// platform/file.h
void read_file(const std::string& path);
// platform/file_linux.cpp
// platform/file_win.cpp

用 CMake 选文件:

if(WIN32)
    set(PLAT_SRC file_win.cpp)
else()
    set(PLAT_SRC file_linux.cpp)
endif()

七、常用跨平台库(强烈推荐)

功能
网络 asio
日志 spdlog
配置 nlohmann_json
图形 SDL / GLFW
进程 nothing(避免)
UI Qt(重量级)

八、典型跨平台项目结构

project/
├── CMakeLists.txt
├── include/
│   └── app/
├── src/
│   ├── main.cpp
│   └── platform/
│       ├── file_linux.cpp
│       └── file_win.cpp
└── third_party/

九、常见误区

❌ 在 Linux 上写、直接认为“反正都是 C++ 就跨平台”
❌ 大量 #ifdef
❌ 直接使用系统调用

标准库优先平台差异封装到底层构建系统统一用 CMake


十、一句话总结

Linux 下写跨平台 C++ = 标准 C++ + CMake + 尽量少碰系统 API + 必要时用成熟跨平台库


如果你愿意,我可以:

  • ✅ 给你一个 最小跨平台工程模板
  • ✅ 帮你 改造现有 Linux 程序
  • ✅ 对比 Makefile vs CMake
  • ✅ 讲 Qt / SDL / asio 实战

你现在是在写哪类程序?(服务 / 桌面 / 嵌入式 / 游戏?)

0