代码更改不生效
Code changes do not take effect
我刚开始在 Kubuntu 15.10 上使用 Qt Creator 3.5.0、Qt 5.4.2 和 GCC。我创建了一个新项目,添加了一个 window,目前我正在尝试开发一个新模块。
然而奇怪的事情发生了。
我在我的模板 class X 中写了一个调试输出行。该行位于其模块 header 中的 class X 函数中,例如:
qDebug() << "Hello1" << endl;
构建和 运行 应用程序后,将执行此行,并根据需要在调试控制台中打印 "Hello1"。我也可以使用调试器并单步执行该行。在构建应用程序时,编译器基本上什么都不做,因为没有更改代码文件(如预期的那样)。
当编辑上面的行时,事情变得很奇怪:
- 我将行更改为 "Hello2" 并保存了代码文件。
- 我可以看到源文件的正确更新文件修改 date/time 并且我验证该文件比相应的 object 文件更新。
- 构建项目时,编译器实际上编译了编辑后的源文件并按预期链接了应用程序。我验证了更新的 object 文件 date/time 和更新的可执行文件 date/time.
- 但是当启动应用程序时,行为没有改变!输出仍然是"Hello1".
- 当使用二进制编辑器搜索可执行文件时,我仍然只能看到旧字符串 "Hello1"。没有其他字符串包含 "Hello".
- 再次执行上述操作(将行更改为 "Hello3")后,仍然会打印 "Hello1"。
更多事实:
- 当re-building 整个应用程序或清理项目后更改一次生效。
- 每次编辑都会重现该问题。
- 我无法用任何其他模块观察到这一点,它只发生在一个源模块上,似乎没有显着差异。
- 如前所述,代码行位于模块 header 中。但是修改模块本身并没有改变任何东西。
- 同时更改 class X 和第二个模块不会更改任何内容(第二个模块中的修改生效,class X 中的修改无效)。
- header 和模块都已正确添加到 .pro 文件中。
- 重启 QtCreator 没有任何改变。
- 使用和不使用调试器都会发生这种情况。
- class X 模块的 Makefile 规则看起来很合理,与其他模块的规则没有区别。
我不知道这怎么可能。也许我错过了一些明显的东西。有什么想法吗?
更新:
使用系统监视器我可以确认 运行 进程使用了预期的可执行文件。
检查调试器实际上是哪个 exe 运行ning。它可能是另一个副本!查看进程列表可以确定调试器下的 EXE 是什么。
根据我的个人经验,由于各种原因会出现此一般性问题。文件被复制到 install/staging 区域;环境影响事物;错误的项目设置为"start up";启动调试会话时组件为 运行 的方式最终解析为错误的文件;更改了错误的配置或风格;等等
规则 1:验证您的假设。您检查了文件日期等,但还检查了调试器下实际存在的文件(完整路径)。
您可以尝试一些事情:
- 检查您打开的 exe 是否在与创建的相同的路径上(您可以查看 .pro.user 文件来验证它。
- 检查当你编译时,它是否先保存了更改然后一起编译,否则看起来它做了但实际上没有。
- 如果您更改了 .pro 文件 运行 qmake 并重新构建它。
- 尝试清理,运行ing qmake 并重新构建项目。
- 如果您更改了 .pro 文件或包含外部库或文件,请检查输出日志以查看是否一切正常,有时不是,但仍然可以编译(然后不会 link好吧,或者只是让你使用旧的编译版本。
它似乎正在编译您代码的最后一个 'version',并且出于某些原因和其他原因没有应用更改(如果我考虑其他事情,我稍后会编辑 post ).
希望对您有所帮助
我也遇到过这个问题。我能够通过清理解决它(在我的情况下 运行 catkin clean
)然后 re-building 它(catkin_make
)。
不幸的是,我无法找出问题的确切原因,但希望更有知识的人有一个想法。
此外,我的开发环境不同(Ubuntu 14.04、Qmake 3.1、Qt 5.9.1、gcc 4.8.4、catkin tools 0.4.4、Qt Creator 等)所以显然我的修复可能不会为每个人工作。
修改您的 main.cpp 并重新编译这应该会更新您的代码。不知道为什么会这样,但我添加了一个 cout << "Ver: 1 \n";并在每次更改头文件时更新编号。这似乎是一种解决方法。
Qt 5.8下问题依然存在:
Qt 5.8 使用 clang,在 Qt Creator 中为 OSX 下的 OSX 构建 64 位时,此问题继续出现。所以这不是 GCC 问题。
解法:
我能够通过以下方式获得相关编译以正确响应对新添加的头文件的更改:
- 正在清理项目
- 运行 QMake
- 重建整个项目。
支票:
在执行上述操作之前,我检查了项目文件并确保新文件列在 HEADERS
部分(确实如此。)尽管如此,Qt 不会重建包含 .h
文件.
我刚开始在 Kubuntu 15.10 上使用 Qt Creator 3.5.0、Qt 5.4.2 和 GCC。我创建了一个新项目,添加了一个 window,目前我正在尝试开发一个新模块。
然而奇怪的事情发生了。
我在我的模板 class X 中写了一个调试输出行。该行位于其模块 header 中的 class X 函数中,例如:
qDebug() << "Hello1" << endl;
构建和 运行 应用程序后,将执行此行,并根据需要在调试控制台中打印 "Hello1"。我也可以使用调试器并单步执行该行。在构建应用程序时,编译器基本上什么都不做,因为没有更改代码文件(如预期的那样)。
当编辑上面的行时,事情变得很奇怪:
- 我将行更改为 "Hello2" 并保存了代码文件。
- 我可以看到源文件的正确更新文件修改 date/time 并且我验证该文件比相应的 object 文件更新。
- 构建项目时,编译器实际上编译了编辑后的源文件并按预期链接了应用程序。我验证了更新的 object 文件 date/time 和更新的可执行文件 date/time.
- 但是当启动应用程序时,行为没有改变!输出仍然是"Hello1".
- 当使用二进制编辑器搜索可执行文件时,我仍然只能看到旧字符串 "Hello1"。没有其他字符串包含 "Hello".
- 再次执行上述操作(将行更改为 "Hello3")后,仍然会打印 "Hello1"。
更多事实:
- 当re-building 整个应用程序或清理项目后更改一次生效。
- 每次编辑都会重现该问题。
- 我无法用任何其他模块观察到这一点,它只发生在一个源模块上,似乎没有显着差异。
- 如前所述,代码行位于模块 header 中。但是修改模块本身并没有改变任何东西。
- 同时更改 class X 和第二个模块不会更改任何内容(第二个模块中的修改生效,class X 中的修改无效)。
- header 和模块都已正确添加到 .pro 文件中。
- 重启 QtCreator 没有任何改变。
- 使用和不使用调试器都会发生这种情况。
- class X 模块的 Makefile 规则看起来很合理,与其他模块的规则没有区别。
我不知道这怎么可能。也许我错过了一些明显的东西。有什么想法吗?
更新: 使用系统监视器我可以确认 运行 进程使用了预期的可执行文件。
检查调试器实际上是哪个 exe 运行ning。它可能是另一个副本!查看进程列表可以确定调试器下的 EXE 是什么。
根据我的个人经验,由于各种原因会出现此一般性问题。文件被复制到 install/staging 区域;环境影响事物;错误的项目设置为"start up";启动调试会话时组件为 运行 的方式最终解析为错误的文件;更改了错误的配置或风格;等等
规则 1:验证您的假设。您检查了文件日期等,但还检查了调试器下实际存在的文件(完整路径)。
您可以尝试一些事情:
- 检查您打开的 exe 是否在与创建的相同的路径上(您可以查看 .pro.user 文件来验证它。
- 检查当你编译时,它是否先保存了更改然后一起编译,否则看起来它做了但实际上没有。
- 如果您更改了 .pro 文件 运行 qmake 并重新构建它。
- 尝试清理,运行ing qmake 并重新构建项目。
- 如果您更改了 .pro 文件或包含外部库或文件,请检查输出日志以查看是否一切正常,有时不是,但仍然可以编译(然后不会 link好吧,或者只是让你使用旧的编译版本。
它似乎正在编译您代码的最后一个 'version',并且出于某些原因和其他原因没有应用更改(如果我考虑其他事情,我稍后会编辑 post ).
希望对您有所帮助
我也遇到过这个问题。我能够通过清理解决它(在我的情况下 运行 catkin clean
)然后 re-building 它(catkin_make
)。
不幸的是,我无法找出问题的确切原因,但希望更有知识的人有一个想法。
此外,我的开发环境不同(Ubuntu 14.04、Qmake 3.1、Qt 5.9.1、gcc 4.8.4、catkin tools 0.4.4、Qt Creator 等)所以显然我的修复可能不会为每个人工作。
修改您的 main.cpp 并重新编译这应该会更新您的代码。不知道为什么会这样,但我添加了一个 cout << "Ver: 1 \n";并在每次更改头文件时更新编号。这似乎是一种解决方法。
Qt 5.8下问题依然存在:
Qt 5.8 使用 clang,在 Qt Creator 中为 OSX 下的 OSX 构建 64 位时,此问题继续出现。所以这不是 GCC 问题。
解法:
我能够通过以下方式获得相关编译以正确响应对新添加的头文件的更改:
- 正在清理项目
- 运行 QMake
- 重建整个项目。
支票:
在执行上述操作之前,我检查了项目文件并确保新文件列在 HEADERS
部分(确实如此。)尽管如此,Qt 不会重建包含 .h
文件.