qt改了一个文件全部重新编译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt改了一个文件全部重新编译相关的知识,希望对你有一定的参考价值。
参考技术A 1 需要重新编译2 因为Qt的编译过程是将源代码编译为目标代码,如果修改了一个文件,需要重新编译整个项目,否则会出现编译错误。
3 可以使用Qt的增量编译功能,只编译修改过的文件和依赖它的文件,从而缩短编译时间。
但是如果修改的文件涉及到了项目结构或者配置文件等,还是需要重新编译整个项目。
更改后,QT QML资源文件不会重新编译
我正在使用QT 5.9.1在Mac OS上工作。我的项目是带有C ++逻辑和QML UI Layer的移动应用程序。所有QML文件都包含在qml.qrc文件中,因此在我的.pro文件中
RESOURCES + = qml.qrc
在qml.qrc里面有一个我在Project中使用的所有资源文件的列表,比如图片,图标和QML文件,在QT Creator中显示OK:
正如您所看到的,当其他文件位于子文件夹中时,某些QML文件位于qml.qrc的ROOT路径中,例如“QRC:/片/”。
所以问题是我在位于qml.qrc的根目录中的文件中进行了更改 - 当我按下构建,重建或清理和构建时,它们通常会被重新编译,所以我可以看到我的更改。因此,在我的构建目录中,我看到qml_qrc.cpp(因为我理解这个文件包含我的资源文件的cpp表示并用于编译它们)文件被刷新,我的更改被应用,一切正常。
这里只是这个文件的一部分,它以MainPage.qml资源文件的cpp十六进制表示开头。
/ ******************* *************************** **资源对象代码** **创建者:Qt版本5.9.1的资源编译器** ** 警告!此文件中所做的所有更改都将丢失! ************************************************** *************************** /
static const unsigned char qt_resource_data [] = {// /Users/admin/QtProjects/LazuritApp-temp/MainPage.qml 0x0,0x0,0x7,0xd1,0x0, 0x0,0x1e,0xbb,0x78,0x9c,0xd5,0x19,0x5d,0x6f,0xdc,0x36,0xf2,0x7d,0x7f,0x5,0x6f,0xb,0x14,0xbb,0x69,0xa2,0xf5,0xae,0xed,0xa4, 0xde,0xa0,0x77,0xf0,0xba,0x49,0x63,0x20,0x45,0xda,0xda,0x68,0x1e,0xe,0x45,0xc1,0x95,0xa8,0x15,0x2f,0x5a,0x51,0xa5,0x24,0xdb, 0x5b,0xc3,0x40,0xda,0x2,0xed,0x1,0x79,0x28,0x70,0x68,0x71,0xcf,0xf7,0xf,0xdc,0xbb,0x6b,0x1b,0x34,0x4d,0xfa,0x17,0xb4,0xff, 0xa8,0x43,0x52,0x5f,0x94的,
..............
但是,如果我更改位于子文件夹中的资源文件,qml_qrc.cpp文件不会刷新,因此我的资源文件不会重建,即使我尝试清理,然后重建。即使我手动“运行qmake”然后重建。唯一有用的是在这种情况下 - 手动删除构建文件夹(或者更确切地说,您可以删除qml_qrc.cpp文件)。因此,按“Build”将创建新的qml_qrc.cpp文件,该文件将包含正确的代码,我在资源文件中进行了更改。
有人可以帮助我或解释为什么会发生这种情况,在这种情况下我该怎么办?手动删除和重建很烦人,但将所有资源文件放在项目的根路径中也不是一个好的决定......
我也尝试过粘贴
更新qml
qml_scenes.depends = $$ PWD / QML Files / OrdersPage.qml
qml_scenes.commands = QMAKE_EXTRA_TARGETS + = qml_scenes
正如描述here,但它没有帮助
好吧,经过几个小时的挖掘QTBUGS跟踪,stackoverflow和其他论坛,我找到了解决方案,以某种方式让我满意..
1)使用“touch”命令创建脚本文件(对我而言,我在.OS文件中使用.OS文件,对于Windows,它将是.bat文件),对qml.qrc文件。在我的情况下它包含2行:
#!/ bin / sh的
触摸qml.qrc
2)添加自定义构建步骤(项目 - >构建设置 - >构建步骤 - >添加自定义构建步骤)。选择创建的.sh文件,找到构建时选择工作目录。将此自定义步骤作为第一个执行(在qmake和Make之前)
3)因此,现在每次构建项目时都会编译qml资源文件的更改。脚本将首先触及我们的qml.qrc文件,该文件将刷新它的修改日期,以便qml.qrc(因此,我们的qml资源)也将被添加到makefile依赖项中。
它似乎是解决问题的非常粗糙的方法,但至少你不需要清理,重建等等。
如果有人有更好的解决方案,请告诉我)
不幸的是,评论中提供的链接中给出的解决方案似乎是不完整和/或破坏的。但它可以这样做:
update_qml.target = qml.qrc
update_qml.commands = echo>>$${update_qml.target} # same as touch
update_qml.depends = $$files(path/to/resource/files/*, true) # recurse into subdirs
QMAKE_EXTRA_TARGETS += update_qml
PRE_TARGETDEPS += $${update_qml.target}
对于那些对它如何工作感兴趣的人,QMAKE_EXTRA_TARGETS
会生成以下Makefile规则:
qml.qrc: file1 file2 ...
echo>>qml.qrc
因此,发出命令make qml.qrc
将根据需要更新qml.qrc
的时间戳。但是,为了避免我们每次手动输入它,我们还使用PRE_TARGETDEPS
来修复主要建筑规则:
$(DESTDIR_TARGET): qml.qrc $(OBJECTS) and other stuff ...
$(LINKER) flags objects and other stuff ...
因此,现在make
实用程序将在每次构建目标时扫描先前的规则。
以上是关于qt改了一个文件全部重新编译的主要内容,如果未能解决你的问题,请参考以下文章
vs2010如何生成单个项目,每次编译所有的项目都全部重新生成了