必须用CMakeLists.txt识别系统差异并自动适配:声明cmake_minimum_required(VERSION 3.10),project(... LANGUAGES CXX),设置C++17标准,用WIN32/UNIX AND NOT APPLE/APPLE分支加载平台专属源码、宏定义、头文件路径及链接库。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Windows、Linux、macOS上用同一份代码一键编译出对应平台的可执行文件,必须让CMakeLists.txt能识别系统差异并自动适配编译逻辑,否则在另一台机器上运行cmake ..就会报错或链接失败。
声明最低版本与项目基础信息
打开项目根目录,新建或编辑 CMakeLists.txt 文件,第一行必须写明最低支持的CMake版本——低于3.10会导致跨平台条件判断失效。
cmake_minimum_required(VERSION 3.10)
project(MyApp VERSION 1.2 LANGUAGES CXX)
LANGUAGES CXX 是关键,它告诉CMake这个项目使用C++,后续才能正确启用C++17/20等标准特性。如果只写 project(MyApp),在macOS上可能默认用C标准解析,导致 std::filesystem 编译失败。
设置统一C++标准并启用跨平台兼容开关
添加这两行:
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
这一步不能省略。C++17是目前多平台API(如std::optional、std::filesystem)稳定支持的最低标准。Windows MSVC、Linux GCC 7+、macOS Clang 10+均原生支持。若设为14,macOS下 std::filesystem::exists() 会直接编译不过。
按平台自动加载不同源码与宏定义
方法一:用内置变量做条件分支
if(WIN32)
add_definitions(-DPLATFORM_WINDOWS)
add_executable(${PROJECT_NAME} src/main.cpp src/win_service.cpp)
elseif(UNIX AND NOT APPLE)
add_definitions(-DPLATFORM_LINUX)
add_executable(${PROJECT_NAME} src/main.cpp src/linux_daemon.cpp)
elseif(APPLE)
add_definitions(-DPLATFORM_MACOS)
add_executable(${PROJECT_NAME} src/main.cpp src/macos_menu.mm)
endif()
注意:macOS分支必须用 APPLE 而非 DARWIN,CMake官方只定义了 APPLE 宏;且 .mm 文件需显式加入,否则Clang不会启用Objective-C++混合编译模式。
方法二:提取平台名到变量再复用
if(WIN32)
set(PLATFORM "windows")
elseif(UNIX AND NOT APPLE)
set(PLATFORM "linux")
else()
set(PLATFORM "macos")
endif()
add_executable(${PROJECT_NAME} src/main.cpp src/${PLATFORM}/entry.cpp)
配置头文件与库路径的平台感知逻辑
第一步:声明头文件搜索路径
include_directories(include)
if(APPLE)
include_directories(/opt/homebrew/include)
endif()
if(WIN32)
include_directories("C:/Program Files/Boost/include")
endif()
第二步:链接平台专用库
if(WIN32)
target_link_libraries(${PROJECT_NAME} wsock32 ws2_32)
elseif(UNIX)
target_link_libraries(${PROJECT_NAME} pthread dl m)
endif()
第三步:用 find_package 动态定位第三方库
find_package(OpenSSL REQUIRED)
if(OPENSSL_FOUND)
target_link_libraries(${PROJECT_NAME} ${OPENSSL_LIBRARIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${OPENSSL_INCLUDE_DIR})
endif()
这一步中,find_package 必须放在 platform-specific link 之后,否则在Windows上可能误链入Linux路径下的libcrypto.a,导致链接器崩溃。
生成构建文件并验证平台输出
在项目根目录执行:
mkdir build && cd build → cmake .. → cmake --build .
执行完后检查 build/ 目录内容:
Windows:出现 MyApp.sln 和 *.vcxproj 文件
Linux:出现 Makefile 和 CMakeFiles/ 目录
macOS:出现 MyApp.xcodeproj(若装有Xcode命令行工具)
任一平台缺失对应产物,说明 CMakeLists.txt 中的平台判断分支未触发。


















