使用标准C++和CMake可实现跨平台编译,避免平台专属API,用std::filesystem处理路径,通过CMakeLists.txt统一构建流程,在Windows和Linux上分别使用MSVC或g++编译。

要在 Windows 和 Linux 下编译同一个 C++ 程序,关键在于编写跨平台兼容的代码,并使用合适的构建工具。只要避免平台相关的 API 和文件路径问题,大多数标准 C++ 代码可以在两个系统上顺利编译运行。
1. 使用标准 C++ 语法和库
确保代码只依赖 C++ 标准库(如 iostream、vector、string 等),不调用操作系统特有的功能。
- 用 std::filesystem(C++17 起)处理文件路径,它会自动适配不同系统的路径分隔符
- 避免使用 windows.h> 或
等平台专属头文件 - 如果必须使用系统调用,用宏判断平台:
#ifdef _WIN32
// Windows 相关代码
#include
#else
// Linux 相关代码
#include
#endif
2. 选择跨平台构建系统
手动调用 g++ 或 cl.exe 不利于跨平台维护。推荐使用以下工具统一构建流程。
CMake 是最常用的跨平台构建工具:
立即学习“C++免费学习笔记(深入)”;
- 编写一个 CMakeLists.txt 文件描述编译规则
- 在 Windows 上可用 MSVC 编译,在 Linux 上用 g++/clang++ 编译
示例 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(MyApp)set(CMAKE_CXX_STANDARD 17)
add_executable(myapp main.cpp utils.cpp)
跨平台编译器设置可选
if(WIN32) message(STATUS "Building on Windows") elseif(UNIX) message(STATUS "Building on Linux") endif()
使用方式:
- Linux: mkdir build && cd build && cmake .. && make
- Windows(需安装 CMake 和编译器):
打开 CMake GUI 或使用命令行生成 Visual Studio 项目,或用 MinGW 编译
3. 统一开发环境与编译器
虽然 Windows 和 Linux 默认编译器不同(MSVC vs g++/clang++),但可通过以下方式统一:
- MinGW-w64:在 Windows 上使用类 GCC 编译器,语法与 Linux 的 g++ 一致
- WSL (Windows Subsystem for Linux):在 Windows 中运行 Linux 子系统,直接用 g++ 编译
- Clang:支持双平台,行为更接近
例如,在 WSL 中写完代码可以直接用 g++ 编译,和 Linux 上完全一样: g++ -std=c++17 -o myapp main.cpp
4. 处理常见跨平台问题
- 换行符:Git 可配置自动转换(core.autocrlf)
- 路径分隔符:用 std::filesystem::path 拼接路径,不要硬编码 "/" 或 "\"
- 动态库扩展名:Linux 是 .so,Windows 是 .dll,打包时注意区分
- main 函数签名:保持 int main() 或 int main(int argc, char* argv[]) 即可
基本上就这些。只要代码规范、构建工具得当,C++ 程序在 Windows 和 Linux 上编译并不复杂,关键是规避平台差异细节。










