温馨提示×

linux c++如何跨平台

小樊
34
2026-10-19 17:29:51
栏目: 编程语言

在 Linux 下用 C++ 做跨平台开发,核心目标是:同一套代码能在 Linux / Windows / macOS(甚至嵌入式)上编译运行。下面从「原则 → 工具 → 实践 → 示例」系统地讲。


一、跨平台的核心原则

1. 避免直接使用平台相关 API

❌ 不推荐:

#include <windows.h>
CreateThread(...)

#include <pthread.h>
pthread_create(...)

✅ 推荐:

  • 使用 C++ 标准库
  • 使用 跨平台抽象库

二、首选:使用 C++ 标准库(最干净)

可用的标准能力(C++11 起已经很强)

功能 标准方式
线程 std::thread
锁 std::mutex
文件 std::filesystem(C++17)
时间 std::chrono
网络 ❌(C++ 暂无标准网络库)
原子 std::atomic

示例:

#include <thread>
#include <iostream>

void foo() {
    std::cout << "hello\n";
}

int main() {
    std::thread t(foo);
    t.join();
}

✅ Linux / Windows / macOS 都能编译


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

✅ 推荐:CMake(事实标准)

cmake_minimum_required(VERSION 3.10)
project(demo)

add_executable(demo main.cpp)

编译:

mkdir build
cd build
cmake ..
make

✅ 支持:

  • Linux (gcc/clang)
  • Windows (MSVC)
  • macOS (clang)

四、处理平台差异(宏隔离)

常见平台宏

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

示例:

#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif

void sleep_ms(int ms) {
#ifdef _WIN32
    Sleep(ms);
#else
    usleep(ms * 1000);
#endif
}

⚠️ 尽量只在一个文件里写平台代码


五、使用跨平台库(强烈推荐)

1. 基础库

需求 推荐
文件系统 std::filesystem
日志 spdlog
配置 nlohmann/json
网络 boost.asio / libcurl
GUI Qt / SDL / wxWidgets

2. Boost(老牌跨平台)

#include <boost/asio.hpp>

✅ Windows / Linux / macOS


3. Qt(大型 GUI 项目)

#include <QApplication>
#include <QPushButton>

✅ 工业级跨平台


六、字符编码问题(容易踩坑)

✅ 统一用 UTF-8

std::string path = u8"中文路径";

Windows 下注意:

SetConsoleOutputCP(CP_UTF8);

七、编译器差异

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

建议:

  • 开启 高警告
-Wall -Wextra

八、实际工程结构建议

project/
├── CMakeLists.txt
├── src/
│   ├── main.cpp
│   └── platform/
│       ├── platform_linux.cpp
│       ├── platform_win.cpp
├── include/

CMake 中:

if(WIN32)
    target_sources(demo PRIVATE src/platform/platform_win.cpp)
else()
    target_sources(demo PRIVATE src/platform/platform_linux.cpp)
endif()

九、常见跨平台坑

坑 说明
路径分隔符 用 /
行尾 Git 自动处理
动态库 .so / .dll / .dylib
线程 用 std::thread
大小写 Linux 区分

十、最小可运行跨平台示例

#include <iostream>
#include <thread>

int main() {
    std::thread t([]{
        std::cout << "Cross platform!\n";
    });
    t.join();
}
g++ main.cpp -std=c++17

总结一句话

Linux C++ 跨平台 = 标准库 + CMake + 平台代码隔离 + 跨平台库

如果你愿意,我可以:

  • 给你一个 完整 CMake 跨平台模板
  • 讲 Windows ↔ Linux 网络编程差异
  • 或针对 嵌入式 / Qt / 服务端 场景细讲

0 踩