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

构建时如何为COMMAND生成的文件创建目录?CMake自定义命令求助

解决CMake自定义命令中预创建输出目录的问题

这个场景太常见了——不少命令行工具都不会自动生成输出文件的父目录,所以我们得在执行转换操作前先把目录建好。这里给你一个跨平台的解决方案,直接集成到你的自定义命令里就行:

修改后的CMake宏代码

MACRO(ConvertToBinary _name)
    # 先定义输出文件的完整路径,方便后续复用
    set(_output_file "${CMAKE_BINARY_DIR}/${_name}.bin")
    # 从输出路径中提取所在目录
    get_filename_component(_output_dir "${_output_file}" DIRECTORY)
    
    ADD_CUSTOM_COMMAND(
        OUTPUT ${_output_file}
        # 第一步:用CMake自带的跨平台命令创建目录
        COMMAND ${CMAKE_COMMAND} -E make_directory ${_output_dir}
        # 第二步:执行二进制转换命令
        COMMAND ${EXE_DIR}/toBinary -i "${CMAKE_CURRENT_SOURCE_DIR}/${_name}" -o ${_output_file}
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_name}
        COMMENT "Converting ${_name} to binary format..."
    )
ENDMACRO()

关键细节说明

  • 跨平台兼容:用${CMAKE_COMMAND} -E make_directory替代系统原生的mkdir(Windows是md),不管是Windows、Linux还是macOS都能正常运行,不用写繁琐的平台判断。
  • 动态适配路径:通过get_filename_component自动提取输出文件的目录,哪怕以后你把输出路径改成更深的嵌套结构(比如${CMAKE_BINARY_DIR}/bin/${_name}.bin),代码也能自动适配,不用手动修改目录路径。
  • 执行顺序保障:CMake会严格按照COMMAND的顺序依次执行,所以创建目录的操作一定会在转换命令之前完成,确保工具能找到合法的输出目录。

简化版(如果输出目录固定)

要是你的输出目录始终是${CMAKE_BINARY_DIR},也可以直接简化成下面这样,省去提取目录的步骤:

MACRO(ConvertToBinary _name)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_BINARY_DIR}/${_name}.bin
        COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}
        COMMAND ${EXE_DIR}/toBinary -i ${CMAKE_CURRENT_SOURCE_DIR}/${_name} -o ${CMAKE_BINARY_DIR}/${_name}.bin
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_name}
        COMMENT "Converting ${_name} to binary format..."
    )
ENDMACRO()

不过还是推荐第一种动态提取的方式,扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:15:20