如何用CMake构建两个独立平台的Visual Studio解决方案?
多平台Visual Studio解决方案的CMake配置优化方案
核心问题
- 希望
Tools-Platform解决方案仅包含someexe-tools和somelib-tools,而非当前混入的x64版本项目 - 未来新增第三个平台解决方案时,避免
add_subdirectory导致的同名项目冲突 - 单个
CMakeLists.txt中多次设置CMAKE_GENERATOR_PLATFORM是否合理,若不合理该如何调整配置与文件夹结构
解决方案
1. 让Tools-Platform仅包含对应平台的项目
当前子项目的CMakeLists.txt硬编码生成x64和tools两个版本,导致引入时会同时创建所有项目。需通过条件编译+变量传递,让子项目仅生成指定平台的目标:
修改scripts/tools/CMakeLists.txt:
cmake_minimum_required(VERSION 3.28) project(Tools-Platform) # 定义当前目标平台,传递给子项目 set(CURRENT_PLATFORM "tools" CACHE STRING "Target platform for this solution") # 统一指定生成器平台 set(CMAKE_GENERATOR_PLATFORM "${CURRENT_PLATFORM}") # 添加子项目,指定独立构建目录避免冲突 add_subdirectory(../../somelib ../../build/tools/somelib) add_subdirectory(../../someexe ../../build/tools/someexe)
修改someexe/CMakeLists.txt:
cmake_minimum_required(VERSION 3.28) # 根据传入的平台变量生成对应项目 if(CURRENT_PLATFORM STREQUAL "x64") project(someexe-x64 CXX) add_executable(someexe-x64 main.cpp) elseif(CURRENT_PLATFORM STREQUAL "tools") project(someexe-tools CXX) add_executable(someexe-tools main.cpp) endif()
修改somelib/CMakeLists.txt:
cmake_minimum_required(VERSION 3.28) if(CURRENT_PLATFORM STREQUAL "x64") project(somelib-x64 CXX) add_library(somelib-x64 main.cpp) elseif(CURRENT_PLATFORM STREQUAL "tools") project(somelib-tools CXX) add_library(somelib-tools main.cpp) endif()
2. 避免未来新增平台时的同名项目冲突
核心思路是为每个平台分配独立的构建目录,并通过CURRENT_PLATFORM变量控制子项目生成唯一命名的目标:
- 新增平台(如
arm64)时,在scripts下新建arm64目录,编写对应的CMakeLists.txt,设置CURRENT_PLATFORM为arm64,构建目录指定为../../build/arm64/xxx - 每个平台的构建目录完全独立,项目目标名称包含平台后缀(如
someexe-arm64),从根本上避免同名冲突
3. 规范CMAKE_GENERATOR_PLATFORM的使用
CMAKE_GENERATOR_PLATFORM是全局生成器参数,用于指定Visual Studio的平台工具集,在单个CMakeLists.txt中多次设置会导致配置混乱,正确用法是:
- 在每个解决方案的入口脚本(如
scripts/tools/CMakeLists.txt)中仅设置一次,或在CMake配置命令行通过-A参数指定(例:cmake -G "Visual Studio 17 2022" -A x64 ..) - 子项目通过
CURRENT_PLATFORM或读取CMAKE_GENERATOR_PLATFORM的值,条件生成对应平台的目标,不再在子项目中重复设置该变量
优化后的文件夹结构
CMakeLists.txt ├── someexe │ └── CMakeLists.txt ├── somelib │ └── CMakeLists.txt ├── scripts │ ├── tools │ │ └── CMakeLists.txt │ ├── x64 │ │ └── CMakeLists.txt │ └── arm64 # 未来新增平台 │ └── CMakeLists.txt └── build # 自动生成的独立构建目录 ├── tools │ ├── somelib │ └── someexe ├── x64 │ ├── somelib │ └── someexe └── arm64 ├── somelib └── someexe
内容的提问来源于stack exchange,提问作者chadb
相关产品推荐
相关产品推荐

