首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在每次构建中强制qrc文件的rcc

在每次构建中强制qrc文件的rcc
EN

Stack Overflow用户
提问于 2017-05-18 12:08:27
回答 2查看 1.4K关注 0票数 1

如何强制在2015中的每个构建上对qrc文件进行rcc?我们将资源嵌入到二进制文件中,因此,如果qml或图像资产等内容发生变化,则需要运行rcc以获得当前状态的新.cpp文件。我看到了几个选项--在预构建事件中残酷地触摸.qrc文件,运行一个脚本,在构建之前检查资产文件夹中的所有内容,检查时间戳,并将它们与上一次构建时的状态进行比较。有没有更干净、更优雅的选择?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-02 09:28:23

因为它是在评论中要求的,所以我正在发布我想出的解决方案。因此,在我的示例中,qrc文件被添加到Visual解决方案中,并且有一个适当的自定义构建工具集(但这是常见的方法,应该由VS Qt插件来设置)如下:

我所要做的就是做一个简单的C#程序,它读取qrc的内容并更新qrc文件的修改时间戳,如果包含的任何项比qrc本身更新的话。这就是它所需要的一切:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.IO;

namespace QrcValidator
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                System.Console.WriteLine("usage: QrcValidator.exe <qrc file path>");
                return;
            }
            Console.WriteLine(string.Format("Validating {0}", args[0]));
            XDocument qrcDocument = XDocument.Load(args[0]);
            var qrcFileLastWrtieTimeUtc = File.GetLastWriteTimeUtc(args[0]);
            foreach (var file in qrcDocument.Descendants("RCC").Descendants("qresource").Descendants("file"))
            {
                if (File.GetLastWriteTimeUtc(file.Value) >= qrcFileLastWrtieTimeUtc)
                {
                    Console.WriteLine("{0} is dirty, setting last write time of {1} to current UTC time", file.Value, args[0]);
                    File.SetLastWriteTimeUtc(args[0], DateTime.UtcNow);
                    Environment.Exit(0);
                }
            }
        }
    }
}

该工具将qrc文件作为第一个参数。因此,我只是将此工具添加为预构建事件,如果资源发生任何更改,则会触及qrc文件,并调用它的正常构建命令。

票数 0
EN

Stack Overflow用户

发布于 2018-06-25 05:57:05

如果要使用CMake,则可以添加预生成任务以从生成目录中删除your-project-name_autogen文件夹。这迫使CMake对每个构建的qrc文件进行rcc。

该命令看起来可能类似于:

代码语言:javascript
复制
add_custom_command (TARGET your-project-name PRE_BUILD
    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/your-project-name_autogen)

CMake通过将预构建事件添加到其生成的Visual项目中来实现这一点,因此您也可以仅用Visual复制它。如果您还没有找到预构建事件部分,右键单击所需的项目(不是解决方案),然后选择Properties。在Build Events下,应该有一个名为Pre-Build Events的节。像del your-files这样的命令可能就足够了。

下面的答案给出了其他一些像样的选择。

How to delete files in Visual Studio Pre-build event command line

CMake命令解决了qrc文件中包含QML资源的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44047364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档