在Linux系统上开发跨平台程序时,CMake是常用的构建工具,它能够通过统一的配置文件生成不同平台对应的构建脚本,避免为Windows、macOS等不同系统单独编写构建逻辑。合理的CMake配置可以让程序在不同环境下保持一致的编译行为。

CMake基础配置结构
跨平台CMake配置的核心是通过CMakeLists.txt文件定义构建规则,首先需要明确项目的基本信息和最低版本要求,避免不同CMake版本带来的兼容性问题。
基础的CMakeLists.txt开头配置如下:
# 指定CMake最低版本要求 cmake_minimum_required(VERSION 3.10) # 定义项目名称和支持的语言 project(cross_platform_demo C CXX) # 设置C++标准,避免不同编译器默认标准差异 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON)
平台条件判断配置
不同操作系统的系统库、路径规则存在差异,需要在CMake中通过条件判断区分不同平台的配置逻辑,常用的判断变量包括CMAKE_SYSTEM_NAME。
平台条件判断的示例配置如下:
# 判断当前编译目标平台
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
# Linux平台下的额外配置
message(STATUS "当前构建平台为Linux")
# 添加Linux特有的编译选项
add_compile_options(-Wall -Wextra)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
# Windows平台下的额外配置
message(STATUS "当前构建平台为Windows")
# 关闭Windows下的特定警告
add_compile_options(/wd4996)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
# macOS平台下的额外配置
message(STATUS "当前构建平台为macOS")
# 设置macOS的部署目标版本
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15")
endif()
跨平台依赖管理
跨平台程序常需要依赖第三方库,不同平台下依赖库的路径和名称可能不同,CMake提供了find_package和自定义查找逻辑来处理这类问题。
依赖管理的配置示例如下:
# 查找系统安装的依赖库,优先使用系统库保证跨平台兼容性
find_package(Threads REQUIRED)
# 自定义查找逻辑处理没有官方CMake配置的库
if(NOT CUSTOM_LIB_FOUND)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(CUSTOM_LIB_PATH "/usr/local/lib")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(CUSTOM_LIB_PATH "C:/libs/custom")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(CUSTOM_LIB_PATH "/usr/local/lib")
endif()
# 检查库文件是否存在
if(EXISTS "${CUSTOM_LIB_PATH}/libcustom.so" OR EXISTS "${CUSTOM_LIB_PATH}/libcustom.dylib" OR EXISTS "${CUSTOM_LIB_PATH}/custom.lib")
set(CUSTOM_LIB_FOUND TRUE)
include_directories("${CUSTOM_LIB_PATH}/include")
link_directories("${CUSTOM_LIB_PATH}")
endif()
endif()
目标文件配置与生成
完成基础配置、平台判断和依赖管理后,需要定义最终生成的可执行文件或库文件,同时关联对应的源文件和依赖项。
目标文件配置示例如下:
# 收集所有源文件
file(GLOB SRC_FILES "src/*.cpp" "src/*.c")
# 生成可执行文件
add_executable(demo ${SRC_FILES})
# 链接依赖库
target_link_libraries(demo PRIVATE Threads::Threads)
if(CUSTOM_LIB_FOUND)
target_link_libraries(demo PRIVATE custom)
endif()
# 设置不同平台下的输出路径
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set_target_properties(demo PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
else()
set_target_properties(demo PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()
编译执行流程
在Linux系统上完成CMakeLists.txt配置后,可以通过以下流程生成对应平台的构建文件并执行编译:
- 创建构建目录,避免污染源文件目录:
mkdir build && cd build - 生成构建脚本:
cmake ..,如果需要生成其他平台的构建文件,可以指定对应的生成器 - 执行编译:
cmake --build .
如果需要在Linux上生成Windows平台的构建文件,可以安装对应的交叉编译工具链后,在cmake命令中指定工具链文件路径即可。
CMakeLinux跨平台构建cross_platform修改时间:2026-07-05 17:48:26