【问题标题】:QT No such file or dictionary when I try to include a header fileQT 当我尝试包含头文件时没有这样的文件或字典
【发布时间】:2021-10-17 22:35:00
【问题描述】:

这是 QT 中非常常见的问题。包含头文件然后报错。

No such file or directory

如何重现问题:

  1. 首先我使用的是 CAN Bus Open SAE J1939 库

  2. 然后我像这样包含源和标题。

    SOURCES += \
     Communication/Database/databasehandling.cpp \
     Tool/Json/jsonhandling.cpp \
     main.cpp \
     Window/Main/mainwindow.cpp \
     Communication/USB/usb.cpp \
     Tool/CAN/Hardware/CAN_Network/CAN_Network.c \
     Tool/CAN/Hardware/Memory/FLASH_EEPROM_RAM_Memory.c \
     Tool/CAN/ISO_11783/ISO_11783-7_Application_Layer/Auxiliary_Valve_Command.c \
     Tool/CAN/ISO_11783/ISO_11783-7_Application_Layer/Auxiliary_Valve_Estimated_Flow.c \
     Tool/CAN/ISO_11783/ISO_11783-7_Application_Layer/Auxiliary_Valve_Measured_Position.c \
     Tool/CAN/ISO_11783/ISO_11783-7_Application_Layer/General_Purpose_Valve_Command.c \
     Tool/CAN/ISO_11783/ISO_11783-7_Application_Layer/General_Purpose_Valve_Estimated_Flow.c \
     Tool/CAN/Open_SAE_J1939/Listen_For_Messages.c \
     Tool/CAN/SAE_J1939/SAE_J1939-21_Transport_Layer/Acknowledgement.c \
     Tool/CAN/SAE_J1939/SAE_J1939-21_Transport_Layer/Request.c \
     Tool/CAN/SAE_J1939/SAE_J1939-21_Transport_Layer/Transport_Protocol_Connection_Management.c \
     Tool/CAN/SAE_J1939/SAE_J1939-21_Transport_Layer/Transport_Protocol_Data_Transfer.c \
     Tool/CAN/SAE_J1939/SAE_J1939-71_Application_Layer/Request_Component_Identification.c \
     Tool/CAN/SAE_J1939/SAE_J1939-71_Application_Layer/Request_ECU_Identification.c \
     Tool/CAN/SAE_J1939/SAE_J1939-71_Application_Layer/Request_Software_Identification.c \
     Tool/CAN/SAE_J1939/SAE_J1939-73_Diagnostics_Layer/DM1.c \
     Tool/CAN/SAE_J1939/SAE_J1939-73_Diagnostics_Layer/DM2.c \
     Tool/CAN/SAE_J1939/SAE_J1939-73_Diagnostics_Layer/DM3.c \
     Tool/CAN/SAE_J1939/SAE_J1939-73_Diagnostics_Layer/DM14.c \
     Tool/CAN/SAE_J1939/SAE_J1939-73_Diagnostics_Layer/DM15.c \
     Tool/CAN/SAE_J1939/SAE_J1939-73_Diagnostics_Layer/DM16.c \
     Tool/CAN/SAE_J1939/SAE_J1939-81_Network_Management_Layer/Address_Claimed.c \
     Tool/CAN/SAE_J1939/SAE_J1939-81_Network_Management_Layer/Address_Delete.c \
     Tool/CAN/SAE_J1939/SAE_J1939-81_Network_Management_Layer/Address_Not_Claimed.c \
     Tool/CAN/SAE_J1939/SAE_J1939-81_Network_Management_Layer/Commanded_Address.c
    
    HEADERS += \
     Communication/Database/databasehandling.h \
     Tool/Json/jsonhandling.h \
     Window/Main/mainwindow.h \
     Communication/USB/usb.h \
     Tool/CAN/Hardware/CAN_Network/CAN_Network.h \
     Tool/CAN/Hardware/Memory/FLASH_EEPROM_RAM_Memory.h \
     Tool/CAN/Hardware/Processor_choice.h \
     Tool/CAN/ISO_11783/ISO_11783_Enums/Enum_Auxiliary_And_General_Purpose_Valves.h \
     Tool/CAN/ISO_11783/ISO_11783-7_Application_Layer/Application_Layer.h \
     Tool/CAN/Open_SAE_J1939/Open_SAE_J1939.h \
     Tool/CAN/Open_SAE_J1939/Structs.h \
     Tool/CAN/SAE_J1939/SAE_J1939_Enums/Enum_Control_Byte.h \
     Tool/CAN/SAE_J1939/SAE_J1939_Enums/Enum_DM1_DM2.h \
     Tool/CAN/SAE_J1939/SAE_J1939_Enums/Enum_DM14_DM15.h \
     Tool/CAN/SAE_J1939/SAE_J1939_Enums/Enum_Group_Function_Value.h \
     Tool/CAN/SAE_J1939/SAE_J1939_Enums/Enum_NAME.h \
     Tool/CAN/SAE_J1939/SAE_J1939_Enums/Enum_PGN.h \
     Tool/CAN/SAE_J1939/SAE_J1939_Enums/Enum_Send_Status.h \
     Tool/CAN/SAE_J1939/SAE_J1939-21_Transport_Layer/Transport_Layer.h \
     Tool/CAN/SAE_J1939/SAE_J1939-71_Application_Layer/Application_Layer.h \
     Tool/CAN/SAE_J1939/SAE_J1939-73_Diagnostics_Layer/Diagnostics_Layer.h \
     Tool/CAN/SAE_J1939/SAE_J1939-81_Network_Management_Layer/Network_Management_Layer.h
    

但我仍然在Transport_Layer.h 文件中遇到一个错误

#ifndef SAE_J1939_21_TRANSPORT_LAYER_SAE_J1939_21_TRANSPORT_LAYER_H_
#define SAE_J1939_21_TRANSPORT_LAYER_SAE_J1939_21_TRANSPORT_LAYER_H_

/* Layers */
#include "../../Hardware/CAN_Network/CAN_Network.h"
#include "../../Open_SAE_J1939/Structs.h"
#include "../SAE_J1939-71_Application_Layer/Application_Layer.h"
#include "../SAE_J1939-73_Diagnostics_Layer/Diagnostics_Layer.h"
#include "../SAE_J1939-81_Network_Management_Layer/Network_Management_Layer.h" <--- This one
#include "../SAE_J1939_Enums/Enum_Control_Byte.h"
#include "../SAE_J1939_Enums/Enum_DM1_DM2.h"
#include "../SAE_J1939_Enums/Enum_DM14_DM15.h"
#include "../SAE_J1939_Enums/Enum_Group_Function_Value.h"
#include "../SAE_J1939_Enums/Enum_NAME.h"
#include "../SAE_J1939_Enums/Enum_PGN.h"
#include "../SAE_J1939_Enums/Enum_Send_Status.h"

还有一个在Application_Layer.h 文件中

#ifndef ISO_11783_ISO_11783_7_APPLICATION_LAYER_ISO_11783_7_APPLICATION_LAYER_H_
#define ISO_11783_ISO_11783_7_APPLICATION_LAYER_ISO_11783_7_APPLICATION_LAYER_H_

/* Layers */
#include "../../Hardware/CAN_Network/CAN_Network.h"
#include "../../ISO_11783/ISO_11783_Enums/Enum_Auxiliary_And_General_Purpose_Valves.h" <-- This one
#include "../../Open_SAE_J1939/Structs.h"
#include "../../SAE_J1939/SAE_J1939-21_Transport_Layer/Transport_Layer.h"
#include "../../SAE_J1939/SAE_J1939_Enums/Enum_PGN.h"

问题:

为什么会这样? 我已经包括在内。 QT Creator IDE 会看到这些文件。那里没问题。但是,编译器似乎不理解这些文件的存在。

我正在使用 QT 5.15.2 和 C++11。

【问题讨论】:

    标签: c++ c qt-creator


    【解决方案1】:

    我找到了适合我的解决方案。您不需要.pri 文件,如此处的答案所示。摆脱它。

    这是我所做的。

    1. 在 QT 中右键单击您的项目。
    2. 选择“添加现有词典”
    3. 标记要导入的词典。现在您会在 .pro 文件中看到很多 .c.h 文件。

    提示:不要使用../../,这会引起麻烦。而是使用项目路径,例如

    "ThirdLibrary/OpenSAEJ1939/...your_h_files.h"
    

    完成!

    【讨论】:

      【解决方案2】:

      由于 OP 提供的信息很少,我无法指出错误的原因,但是当我将第三方库添加到我的项目时,最好创建一个包含链接所需内容的 .pri该项目。在这种情况下:

      ├── 3rdParty
      │   └── OpenSAEJ1939
      │       ├── Hardware
      │       ├── ISO_11783
      │       ├── LICENSE
      │       ├── Open_SAE_J1939
      │       ├── OpenSAEJ1939.pri
      │       └── SAE_J1939
      ├── 68795702.pro
      └── main.cpp
      

      *.pro

      QT       += core gui
      
      greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
      
      CONFIG += c++11
      
      # You can make your code fail to compile if it uses deprecated APIs.
      # In order to do so, uncomment the following line.
      #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
      
      SOURCES += \
          main.cpp
      
      include(3rdParty/OpenSAEJ1939/OpenSAEJ1939.pri)
      

      OpenSAEJ1939.pri

      INCLUDEPATH += $$PWD
      

      ma​​in.cpp

      #include <QApplication>
      #include <QWidget>
      
      #include <ISO_11783/ISO_11783-7_Application_Layer/Application_Layer.h>
      #include <Open_SAE_J1939/Open_SAE_J1939.h>
      #include <SAE_J1939/SAE_J1939-71_Application_Layer/Application_Layer.h>
      #include <SAE_J1939/SAE_J1939-73_Diagnostics_Layer/Diagnostics_Layer.h>
      #include <SAE_J1939/SAE_J1939-81_Network_Management_Layer/Network_Management_Layer.h>
      
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
      
          /* Create our J1939 structure with two ECU */
          J1939 j1939_1 = {0};
          J1939 j1939_2 = {0};
      
          /* Important to sent all non-address to 0xFF - Else we cannot use ECU address 0x0 */
          for(uint8_t i = 0; i < 255; i++){
              j1939_1.other_ECU_address[i] = 0xFF; /* 0xFF is the broadcast address */
              j1939_2.other_ECU_address[i] = 0xFF;
          }
      
          /* Set the ECU address */
          j1939_1.this_ECU_address = 0x80;                                                /* From 0 to 253 because 254 = error address and 255 = broadcast address */
          j1939_2.this_ECU_address = 0x90;
      
          QWidget widget;
          widget.show();
          return a.exec();
      }
      

      你可以找到完整的演示here

      【讨论】:

      • 嗯...只包含标题,但不包含来源。
      • @MrYui 你了解项目是如何编译的吗?您是否阅读过项目的 README(在特殊步骤 4 中)?
      • 我做了和你一样的事情。
      • @MrYui 你试过我提供的演示了吗?先测试那个demo(我已经做了,还可以),如果对你有用,那我的工作就结束了,你的工作开始了,就是:如何把它集成到你的项目中
      • 不,我没有尝试过你的例子。但我似乎找不到源文件。我可以看到头文件并进入它们,但是当我单击头文件中的函数时,什么也没有发生。它说源文件丢失。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2013-07-03
      相关资源
      最近更新 更多