在 Linux 下写 跨平台 C++,核心目标是:同一份代码能在 Linux / Windows / macOS 上编译运行。下面从原则 → 工具 → 实践系统讲一下。
只用标准 C++
fork()、WinAPI)通过抽象层屏蔽平台差异
构建系统要跨平台
#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
| 功能 | 方案 |
|---|---|
| 路径 | std::filesystem(C++17) |
| 文件操作 | std::filesystem |
| 行分隔符 | / 统一(Windows 也支持) |
#include <filesystem>
namespace fs = std::filesystem;
fs::path p = "data/config.json";
if (fs::exists(p)) {}
✅ 使用:
std::threadstd::mutexstd::condition_variable#include <thread>
void task() {}
std::thread t(task);
t.join();
| 方案 | 说明 |
|---|---|
| asio(推荐) | Boost.Asio / standalone asio |
sys/socket.h |
❌ Linux only |
winsock |
❌ Windows only |
#include <asio.hpp>
#include <chrono>
auto now = std::chrono::system_clock::now();
cmake_minimum_required(VERSION 3.16)
project(MyApp)
set(CMAKE_CXX_STANDARD 17)
add_executable(app main.cpp)
优点:
| 平台 | 编译器 |
|---|---|
| Linux | g++ / clang |
| Windows | MSVC / clang-cl |
| macOS | clang |
✅ 建议:
-std=c++17 -Wall -Wextra
#ifdef _WIN32
// Windows
#elif __linux__
// Linux
#elif __APPLE__
// macOS
#endif
✅ 只放在最底层封装中
// 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 + 必要时用成熟跨平台库
如果你愿意,我可以:
你现在是在写哪类程序?(服务 / 桌面 / 嵌入式 / 游戏?)