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

如何使用独立于生成器的单一不变命令通过CMake运行可执行文件?

CMake跨生成器运行可执行目标的方法

目前CMake本身没提供cmake --run --target Foo这种直接跨生成器的运行命令,但有几种不用写生成器判断逻辑的便捷方案:

  • 统一输出目录,固定路径运行
    先在CMakeLists.txt里给目标指定统一的可执行文件输出目录:

    set_target_properties(Foo PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
    

    编译后直接去统一目录运行即可,不管用make、Ninja还是Xcode/VS,可执行文件都会放在bin目录下:

    # 类Unix系统
    ./bin/Foo
    # Windows系统
    .\bin\Foo.exe
    
  • 用生成器表达式获取完整路径
    借助CMake的$<TARGET_FILE:Foo>生成器表达式,直接拿到可执行文件的绝对路径,不用自己拼接路径:

    # 类Unix终端
    EXEC_PATH=$(cmake -E evaluate "$<TARGET_FILE:Foo>") && "$EXEC_PATH"
    # Windows PowerShell
    $execPath = cmake -E evaluate "$<TARGET_FILE:Foo>"
    & $execPath
    

    这个方法完全不依赖生成器类型,CMake会自动处理Debug/Release等构建类型的路径差异。

  • 自定义CMake运行目标
    在CMakeLists.txt里添加一个自定义目标,把编译和运行步骤绑定在一起:

    add_custom_target(run_Foo
        COMMAND "$<TARGET_FILE:Foo>"
        DEPENDS Foo  # 确保先编译Foo再运行
        WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
        COMMENT "Running executable Foo..."
    )
    

    之后只需要一条命令就能完成编译+运行:

    cmake --build . --target run_Foo
    

以上几种方案都能避免写那种判断生成器的冗余代码,完全利用CMake自身机制解决跨生成器的路径差异问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:03:20