使用标准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> 或 <unistd.h> 等平台专属头文件
- 如果必须使用系统调用,用宏判断平台:
#ifdef _WIN32
// Windows 相关代码
#include <windows.h>
#else
// Linux 相关代码
#include <unistd.h>
#endif
2. 选择跨平台构建系统
手动调用 g++ 或 cl.exe 不利于跨平台维护。推荐使用以下工具统一构建流程。
CMake 是最常用的跨平台构建工具:
立即学习“C++免费学习笔记(深入)”;
- 编写一个 CMakeLists.txt 文件描述编译规则
- 在 Windows 上可用 MSVC 编译,在 Linux 上用 g++/clang++ 编译
示例 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(MyApp)
<p>set(CMAKE_CXX_STANDARD 17)</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/2643" title="DeepSider"><img
src="https://img.php.cn/upload/ai_manual/001/246/273/176913842282738.png" alt="DeepSider" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/2643" title="DeepSider">DeepSider</a>
<p>浏览器AI侧边栏对话插件,集成多个AI大模型</p>
</div>
<a href="/ai/2643" title="DeepSider" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p>add_executable(myapp main.cpp utils.cpp)</p><h1>跨平台编译器设置可选</h1><p>if(WIN32)
message(STATUS "Building on Windows")
elseif(UNIX)
message(STATUS "Building on Linux")
endif()</p>使用方式:
- 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 上编译并不复杂,关键是规避平台差异细节。









