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

Visual Studio 2017 CMake项目:如何单步构建两个目标

实现单次构建Windows和WSL Linux双目标的方案

当然可以实现!我之前在做跨平台CMake项目时也遇到过类似的需求,通过VS的构建后事件或者CMake自定义目标都能搞定,下面给你两种实用的配置方案:

方案1:通过VS 2017的构建后事件触发

这种方式直观易操作,直接在VS里配置当前Windows目标的构建后步骤,自动触发Linux目标的构建:

  1. 打开你的CMake项目,先切换到x64-Debug(Windows目标)配置。
  2. 右键项目根节点 → 属性 → 导航到配置属性 → 生成事件 → 生成后事件。
  3. 在「命令行」输入框中,添加触发Linux-Debug构建的命令:
    如果你习惯用VS的MSBuild命令,可以这样写:
    msbuild "$(SolutionDir)YourProjectName.vcxproj" /t:Build /p:Configuration=Linux-Debug /p:Platform=x64
    
    或者直接调用CMake的构建命令(更贴合CMake项目的逻辑):
    cmake --build "$(SolutionDir)out/build/Linux-Debug" --config Debug
    

    注意:$(SolutionDir)是VS的内置宏,会自动替换为你的解决方案目录,确保Linux构建目录的路径和你实际配置的一致。

  4. 在「执行后生成事件」下拉框选择成功时(确保只有当前Windows构建成功后才触发Linux构建),或者选总是(不管当前构建结果都执行)。
  5. 点击「确定」保存配置,之后只要构建x64-Debug目标,完成后就会自动启动Linux-Debug的构建。

方案2:在CMakeLists.txt中添加自定义目标

如果你想把双构建逻辑固化到CMake脚本里,避免每次在VS里手动配置,可以添加一个自定义的全量构建目标:

  1. 打开项目根目录的CMakeLists.txt,在合适的位置添加以下代码:
    # 定义一个自定义目标,同时构建Windows和Linux版本
    add_custom_target(build_all ALL
        # 先构建Windows x64-Debug目标
        COMMAND cmake --build ${CMAKE_CURRENT_BINARY_DIR}/x64-Debug --config Debug
        # 再构建WSL Linux-Debug目标,注意路径转换(WSL下需要用Linux格式路径)
        COMMAND wsl bash -c "cmake --build $(wslpath -u ${CMAKE_CURRENT_BINARY_DIR}/Linux-Debug) --config Debug"
        COMMENT "正在构建Windows和Linux双目标..."
    )
    

    注意:wslpath -u命令会把Windows格式的路径转换成WSL识别的Linux格式,确保Linux环境能找到构建目录;如果你的Linux构建目录本身就是在WSL的文件系统里,可以直接写Linux路径。

  2. 保存CMakeLists.txt后,VS会自动重新加载CMake配置。
  3. 在VS的「解决方案资源管理器」→「CMake目标」里找到build_all目标,右键选择生成,就能一次性触发两个环境的构建了。

一些需要注意的细节

  • 确保你的WSL环境已经正确配置,VS能正常连接到WSL的Linux系统,且Linux环境中已经安装了CMake、编译器等必要工具。
  • 如果两个目标之间有依赖关系(比如Windows产物需要用到Linux的输出),记得调整构建命令的顺序,或者通过add_dependencies添加依赖。
  • 若想控制构建失败后的行为,可以在命令中用&&(仅当前面命令成功时才执行后面)或||(前面失败时执行后面)来调整逻辑。

内容的提问来源于stack exchange,提问作者Rajesh Rathod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:27:56