cmake ..就可能报错或链接失败。下面直接解析关键配置步骤。

声明最低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+均原生支持。若设为C++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中的平台判断分支未被触发。
