【问题标题】:Source file changes lead to recompilation of huge parts of project源文件更改导致重新编译大部分项目
【发布时间】:2016-07-16 21:53:26
【问题描述】:

[更新]

当改变一个特定的源文件时,在构建项目编译需要大约。 10分钟。其他源文件的更改会导致或多或少的即时构建时间。我想如果我将变化最大的部分移到 pimpl 类中,编译时间将不再受到影响。

我不明白为什么会这样。我没有更改类的头文件。标头本身只做#include <QWidget> 并转发声明了10 个类。当更改没有直接包含的源文件时,有什么原因会导致重新编译(在构建目录中我看到所有目标文件都重新生成)?奇怪的是 pimpl 的工作原理...

这是类的标题:

#ifndef EXPLORER_H
#define EXPLORER_H

#include <QWidget>

... here coming 10 forward declared classes ...

class Explorer : public QWidget
{
    Q_OBJECT
public:
    explicit Explorer(QWidget *parent = 0);
    ~Explorer();
signals:
    ...    
public slots:
    ...
private:
    ExplorerPrivate *p; // pimpl (QObject)
    ...pointers to objects of forward declared classes
};

#endif // EXPLORER_H

编辑

  • 使用 QtCreator 3.2.1 构建

  • 在 mingw 中使用 Qt5.3

  • 正如我所说,cpp 文件不包括在内(已搜索)

  • qmake.exe project.pro -r -spec win32-g++ "CONFIG+=debug"

  • 制作:mingw32-make.exe

编译器控制台会不断重复g++ -c -pipe -fno-keep-inline-dllexport -O2 -std=c++0x -frtti -Wall -Wextra -fexceptions -mthreads [include flags and directories here],最后会出现-o objects\moc_runtimedata.o moc\moc_runtimedata.cpp 或类似的内容。

【问题讨论】:

  • 什么IDE/构建系统?此外,水晶球说 .cpp 文件可能会将我 #included 转换为其他地方的另一个 .cpp。
  • 代码不只是自发地编译自己。你是如何运行编译器的?
  • "How are you running the compiler" 编辑是否足够清晰?我刚刚安装了 QtCreator,没有更改默认编译器参数。
  • Qt creator 显示每次构建时重新编译了多少文件......你检查过这个数字吗?
  • 请问,你在哪里找到那个号码?

标签: c++ qt compile-time moc


【解决方案1】:

启用影子构建时,QtCreator 有一个错误。不确定这是否已报告给 Qt,因为它很难重现。

当此影子构建选项被激活(默认)时,IDE 有时会无法意识到某些项目是最新的,即使源代码未更改也会构建它们。我经常在拥有大量 .pro 文件的大型项目中遇到这种情况,在我的情况下,该项目不仅在不应该构建的时候构建,而且在无限循环中一次又一次地重建。

即使这很烦人,因为输出文件可能会与源文件混合,并且在发布/调试之间切换总是需要干净的构建(因为发布和调试文件是在同一个文件夹中生成的),禁用“影子构建”修复问题。

遇到这种情况的其他人: https://forum.qt.io/topic/30086/endless-loop-of-qmake-exe, http://www.qtcentre.org/threads/59963-a-simple-project-with-quot-Infinite-building-quotQt Creator error endless loop

这里的人报告无限循环,你很幸运你没有结束......

【讨论】:

  • 在重建未更改文件的“好处”上,它似乎也经常忘记构建更改。因此偶尔会出现“clean/qmake/rebuild”例程:D
  • @ddriver:当然,也看到了,特别是在修改 .ui 或 .qrc 时,它们有时永远不会被重新编译成头文件...
  • 恕我直言,为任何超过几个 T.U. 的项目转储 qmake。错误、不一致和未记录的功能的数量太大了。 QtCreator 支持 cmake 就好了,坚持下去。
猜你喜欢
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2018-05-25
  • 1970-01-01
  • 2015-02-07
  • 2012-06-22
  • 1970-01-01
相关资源
最近更新 更多