在 Linux 下用 C++ 做跨平台开发,核心目标是:同一套代码能在 Linux / Windows / macOS(甚至嵌入式)上编译运行。下面从「原则 → 工具 → 实践 → 示例」系统地讲。
❌ 不推荐:
#include <windows.h>
CreateThread(...)
#include <pthread.h>
pthread_create(...)
✅ 推荐:
| 功能 | 标准方式 |
|---|---|
| 线程 | 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_minimum_required(VERSION 3.10)
project(demo)
add_executable(demo main.cpp)
编译:
mkdir build
cd build
cmake ..
make
✅ 支持:
#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
}
⚠️ 尽量只在一个文件里写平台代码
| 需求 | 推荐 |
|---|---|
| 文件系统 | std::filesystem |
| 日志 | spdlog |
| 配置 | nlohmann/json |
| 网络 | boost.asio / libcurl |
| GUI | Qt / SDL / wxWidgets |
#include <boost/asio.hpp>
✅ Windows / Linux / macOS
#include <QApplication>
#include <QPushButton>
✅ 工业级跨平台
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 + 平台代码隔离 + 跨平台库
如果你愿意,我可以: