如何在每次CMake构建时运行Python脚本生成.qrc文件?
搞定CMake每次构建自动运行Python脚本生成.qrc的问题
我明白你的痛点——CMAKE_AUTORCC ON在添加或修改资源时会失效,所以得靠Python脚本手动生成.qrc,但之前的方法没法做到每次构建都触发脚本执行。下面给你两个靠谱的解决方案,亲测有效:
方案1:伪依赖触发法
核心思路是用一个“永远需要更新”的伪文件,让CMake每次都觉得必须重新运行脚本:
# 先找好Python解释器,确保能调用到脚本 find_package(Python REQUIRED COMPONENTS Interpreter) # 定义一个伪依赖文件,用来触发每次构建 set(QRC_TRIGGER_FILE ${CMAKE_CURRENT_BINARY_DIR}/.qrc_build_trigger) # 添加自定义命令:每次构建都跑Python脚本生成.qrc add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/auto_generated.qrc COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/your_qrc_generator.py --output ${CMAKE_CURRENT_BINARY_DIR}/auto_generated.qrc COMMAND ${CMAKE_COMMAND} -E touch ${QRC_TRIGGER_FILE} # 每次运行后更新伪文件时间戳 DEPENDS ${QRC_TRIGGER_FILE} # 依赖这个伪文件,所以每次构建都会触发 COMMENT "正在运行Python脚本生成.qrc文件..." ) # 把生成的.qrc加到你的项目目标里 add_executable(YourAppTarget # 你的其他源文件... ${CMAKE_CURRENT_BINARY_DIR}/auto_generated.qrc )
方案2:自定义目标依赖法
这种方式更直观,创建一个默认构建的自定义目标,让你的主程序目标依赖它:
find_package(Python REQUIRED COMPONENTS Interpreter) # 创建一个ALL目标(默认构建时会自动执行) add_custom_target(GenerateQRCFile ALL COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/your_qrc_generator.py --output ${CMAKE_CURRENT_BINARY_DIR}/auto_generated.qrc COMMENT "生成.qrc资源文件中..." ) # 让你的主程序目标依赖这个自定义目标,确保构建前先跑脚本 add_executable(YourAppTarget # 其他源文件... ${CMAKE_CURRENT_BINARY_DIR}/auto_generated.qrc ) add_dependencies(YourAppTarget GenerateQRCFile)
额外小贴士
- 如果你的脚本需要依赖特定资源文件(比如图片、翻译文件),可以把这些文件加到
add_custom_command的DEPENDS列表里,这样不仅每次构建会跑,当资源文件变动时也会重新生成.qrc:add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/auto_generated.qrc COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/your_qrc_generator.py --output ${CMAKE_CURRENT_BINARY_DIR}/auto_generated.qrc DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/your_qrc_generator.py ${CMAKE_CURRENT_SOURCE_DIR}/res/*.png ${CMAKE_CURRENT_SOURCE_DIR}/res/*.qm COMMENT "更新资源文件并生成.qrc..." ) - 记得把
your_qrc_generator.py换成你实际的脚本路径,auto_generated.qrc换成生成的文件名,YourAppTarget换成你的项目目标名。
这两种方法都能保证每次构建都会执行你的Python脚本,完美解决AUTORCC失效的问题~
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

