You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:46:32