【问题标题】:Clion won't index auto-generated ui header filesClion 不会索引自动生成的 ui 头文件
【发布时间】:2018-09-11 23:07:41
【问题描述】:

我正在查看KeepassXC's source code,我选择了 Clion 作为 IDE。在对源代码进行了一些挖掘和导航之后,我注意到其中一个源文件具有以下#include 指令:

#include "ui_MainWindow.h"

带有红色下划线。用我的鼠标悬停在它上面,它说“'ui_MainWindow.h' not found”。

项目的CMakeLists.txt 文件提供了三种构建类型:

  • 调试
  • 发布
  • 带有调试信息的发布

并且,一旦成功构建所有三种构建类型,CLion 应查找的文件位于以下位置:

cmake-build-(debug|release|relwithdebuginfo)
└── src
    └── keepassx_core_autogen
        └── include
            ├── moc_KMessageWidget.cpp
            ├── ui_AboutDialog.h
            ├── ui_CategoryListWidget.h
            ├── ui_ChangeMasterKeyWidget.h
            ├── ui_CloneDialog.h
            ├── ui_CsvImportWidget.h
            ├── ui_DatabaseOpenWidget.h
            ├── ui_DatabaseSettingsWidgetEncryption.h
            ├── ui_DatabaseSettingsWidgetGeneral.h
            ├── ui_DatabaseSettingsWidget.h
            ├── ui_DetailsWidget.h
            ├── ui_EditEntryWidgetAdvanced.h
            ├── ui_EditEntryWidgetAutoType.h
            ├── ui_EditEntryWidgetHistory.h
            ├── ui_EditEntryWidgetMain.h
            ├── ui_EditEntryWidgetSSHAgent.h
            ├── ui_EditGroupWidgetMain.h
            ├── ui_EditWidget.h
            ├── ui_EditWidgetIcons.h
            ├── ui_EditWidgetProperties.h
            ├── ui_EntryAttachmentsWidget.h
            ├── ui_MainWindow.h
            ├── ui_PasswordGeneratorWidget.h
            ├── ui_SearchWidget.h
            ├── ui_SettingsWidgetGeneral.h
            ├── ui_SettingsWidgetSecurity.h
            ├── ui_SetupTotpDialog.h
            ├── ui_TotpDialog.h
            └── ui_WelcomeWidget.h

尝试了几个小时后,我发现了一些奇怪的东西。只有当我在调试模式下构建项目时,红色下划线才会消失(代码导航也会起作用)(即它只会从cmake-build-debug 中选择文件)。 如果我清理调试版本并使用发布版本,我无法让 CLion 从cmake-build-release 中选择文件。同样适用于cmake-build-relwithdebinfo

代码编译运行正常,说明CMake配置正确。

【问题讨论】:

  • 我不是 CLion 的专家(而不是 VS2013)。但是,不管 IDE 是否考虑头文件 - 编译器找到包含的内容很重要。 (在 IDE 的项目中显示它们只是为了方便。) VS2013 带有 Intellisense,如果它“认为”它们不正确,它会用红线注释事情。大多数情况下,这很好,但在某些情况下它会失败。我停下来对此感到恼火——Intellisense 并不是真正的 C++ 编译器。所以,充其量,我只是简单地忽略这些误报......
  • @Scheff 我同意,但是我的文件中充满了红线(即,每次在所谓的丢失文件中声明的对象上调用方法时)。另外,就像我说的,这不是我的代码;所以代码导航和工具提示可以帮助我理解代码的作用。
  • 在 VS2013 中,一位同事编写了我们的 cmake 脚本,该脚本(除其他外)将所有自动生成的文件添加到单独的项目(子)文件夹中。如前所述,这只是为了方便。如果文件是#included 但尚未创建,Intellisense 可能会对其进行注释。所以,没有解决办法?可能是将自动生成的标题#includes 移动到您在最终目的地#include 的另一个标题。因此,您无需担心“主要”来源中的所有红线。 (这意味着半认真。自行决定这是否适合您。);-)

标签: qt cmake qt5 clion


【解决方案1】:

您可以通过更改Build, Execution, Deployment > Toolchains 下的Clion 环境来改用Qt 安装的编译器来解决此问题。 对于 MinGW 64bit,您可以在 C:\Qt\Qt5.x.x\Tools\mingwxxx_64 下找到它。

【讨论】:

    【解决方案2】:

    这个答案https://stackoverflow.com/a/31293158/192798 帮助我找到了适合我的案例的解决方案。我也遇到了同样的问题,它曾经在哪里工作,然后突然找不到头文件。对我来说,我使用了target_include_directories,所以我不得不告诉 clion 选择与目标相对应的配置。 (我选择了目标的依赖项之一。)然后我构建,然后我可以切换到任何配置。

    对于您的情况,在切换配置后,您可能需要构建以获取 clion 来获取文件。

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2014-08-26
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      相关资源
      最近更新 更多