如何使用独立于生成器的单一不变命令通过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
相关产品推荐
相关产品推荐

