Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Basic question: Including headers with INCLUDEPATH doesn't work

Basic question: Including headers with INCLUDEPATH doesn't work

Scheduled Pinned Locked Moved General and Desktop
50 Posts 5 Posters 23.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    Binary91
    wrote on last edited by
    #1

    Hello together,

    I'm working with QtCreator and for all my previous projects, I manually included libraries (headers & sources) by adding them these files to the project.

    Well, I thought there should be an easier solution for that, because when I use pre-installed headers like QWidget.h or QApplication.h, I do not have to add these files to the project.

    So I set an INCLUDEPATH to my project config file:

    INCLUDEPATH += C:/Qt/projects/lib/headers \
                                       C./Qt/projects/lib/sources
    

    and deleted the file attachments in the project.

    By using INCLUDEPATH, QtCreator automatically autofills the name while I type it in my #include directive, BUT when I try to build/run the project, I get the following errors:
    'undefined reference to vtable for "xxx"'
    'undefined reference to vtable for "xxx"'
    ...

    When I manually add the header files and the source files via project -> right mouse click --> add existing files, everything works fine again.

    I think there should be a way to solve this without adding all those libraries manually to the project, because I also don't have to do this with the standard headers/sources from Qt...

    Can someone help me with that?

    Thank you in anticipation!
    Binary

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by mrjj
      #2

      Hi
      'undefined reference to vtable for "xxx"'
      often comes from lack of Q_OBJECT or not running qmake after adding it.
      Are u sure its related to INCLUDEPATH ?
      Remember to run qmake when changing .pro file

      also , you show
      C./Qt/projects/lib/sources
      The DOT there is that typo and its : as it should ?

      Also that seems to point to the CPP folder.

      You only point INCLUDEPATH to .h files
      You must still include the CPP files in the actual project OR
      use the LIBS+= to point to any DLL/SO/LIB file produced.

      as explained here
      http://doc.qt.io/qtcreator/creator-project-qmake-libraries.html

      1 Reply Last reply
      1
      • B Offline
        B Offline
        Binary91
        wrote on last edited by Binary91
        #3

        Hi and thank you for your post.

        Yes, it should be ":" instead, that was not the problem.

        You say, I still have to include the source files (cpp).

        Two questions to that:

        1. Why do I not have to include QWidget.cpp, QApplication.cpp and so on when including such standard headers?

        2. Well, I did include the source files, set INCLUDEPATH to the directory where my header files are located, included them via #include directive in the source files (as I would do with a standard header file), built the project again and still get those errors.

        When I follow thoses errors in QtCreator, I see that they all point to the corresponding source file, like for example:
        project file:

        INCLUDEPATH += C:/Qt/lib/headers
        
        SOURCES += main.cpp \
        libA.cpp \
        libB.cpp
        
        HEADERS += main.h
        

        main.h:

        #include <libA.h>
        #include <libB.h>
        

        libA.h

        class test
        {
          test();
          ~test();
        };
        

        libA.cpp

        #include <libA.h>
        
        test::test() // <-- error here
        {
        }
        
        test::~test()  // <-- error here
        {
        }
        

        As you can see, the problem is that including the header (path should be known because I set it with INCLUDEPATH) into its corresponding source file (which I manually included in my project file).

        Can you imagine what's wrong with that?

        jsulmJ 1 Reply Last reply
        0
        • mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by mrjj
          #4

          Hi

          • Why do I not have to include QWidget.cpp, QApplication.cpp and so on when including such standard headers?

          You should not have to include any standard Qt cpp files. the .H is enough.
          but if you write .pro file BY HAND make sure u include
          TEMPLATE = app
          and stuff like
          QT += core gui
          Else it wont link Qt to it!!

          --

          #include <libA.h>

          test::test() // <-- error here
          {
          }

          --

          Is the file
          libA.cpp IN THE SAME FOLDER as main.cpp ?

          B 1 Reply Last reply
          3
          • mrjjM mrjj

            Hi

            • Why do I not have to include QWidget.cpp, QApplication.cpp and so on when including such standard headers?

            You should not have to include any standard Qt cpp files. the .H is enough.
            but if you write .pro file BY HAND make sure u include
            TEMPLATE = app
            and stuff like
            QT += core gui
            Else it wont link Qt to it!!

            --

            #include <libA.h>

            test::test() // <-- error here
            {
            }

            --

            Is the file
            libA.cpp IN THE SAME FOLDER as main.cpp ?

            B Offline
            B Offline
            Binary91
            wrote on last edited by Binary91
            #5

            @mrjj said in Basic question: Including headers with INCLUDEPATH doesn't work:

            You should not have to include any standard Qt cpp files. the .H is enough.

            Yeah but why do I have to with my own headers? Is there a list of pre-defined standard headers and their corresponding sources so compiler/linker knows that automatically? If yes, couldn't that list be extended by own headers/sources?

            but if you write .pro file BY HAND make sure u include
            TEMPLATE = app
            and stuff like
            QT += core gui
            Else it wont link Qt to it!!

            I do not create the whole project file by myself, QtCreator does that so all that stuff is included.

            Is the file
            libA.cpp IN THE SAME FOLDER as main.cpp ?

            Nope, should it? I thought that exactly this could be avoided by setting an INCLUDEPATH, isn't it? I thought that after setting this path, the compiler/linker knows where to search for those headers, otherwise this INCLUDEPATH doesn't have any sense or am I missing something?

            jsulmJ mrjjM 2 Replies Last reply
            0
            • B Binary91

              Hi and thank you for your post.

              Yes, it should be ":" instead, that was not the problem.

              You say, I still have to include the source files (cpp).

              Two questions to that:

              1. Why do I not have to include QWidget.cpp, QApplication.cpp and so on when including such standard headers?

              2. Well, I did include the source files, set INCLUDEPATH to the directory where my header files are located, included them via #include directive in the source files (as I would do with a standard header file), built the project again and still get those errors.

              When I follow thoses errors in QtCreator, I see that they all point to the corresponding source file, like for example:
              project file:

              INCLUDEPATH += C:/Qt/lib/headers
              
              SOURCES += main.cpp \
              libA.cpp \
              libB.cpp
              
              HEADERS += main.h
              

              main.h:

              #include <libA.h>
              #include <libB.h>
              

              libA.h

              class test
              {
                test();
                ~test();
              };
              

              libA.cpp

              #include <libA.h>
              
              test::test() // <-- error here
              {
              }
              
              test::~test()  // <-- error here
              {
              }
              

              As you can see, the problem is that including the header (path should be known because I set it with INCLUDEPATH) into its corresponding source file (which I manually included in my project file).

              Can you imagine what's wrong with that?

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @Binary91 said in Basic question: Including headers with INCLUDEPATH doesn't work:

              error here

              What is the error?
              If it is something like "multiple definition" or "redefinition", then your header file probably does not contain "include guard", see here: https://en.wikipedia.org/wiki/Include_guard

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • B Binary91

                @mrjj said in Basic question: Including headers with INCLUDEPATH doesn't work:

                You should not have to include any standard Qt cpp files. the .H is enough.

                Yeah but why do I have to with my own headers? Is there a list of pre-defined standard headers and their corresponding sources so compiler/linker knows that automatically? If yes, couldn't that list be extended by own headers/sources?

                but if you write .pro file BY HAND make sure u include
                TEMPLATE = app
                and stuff like
                QT += core gui
                Else it wont link Qt to it!!

                I do not create the whole project file by myself, QtCreator does that so all that stuff is included.

                Is the file
                libA.cpp IN THE SAME FOLDER as main.cpp ?

                Nope, should it? I thought that exactly this could be avoided by setting an INCLUDEPATH, isn't it? I thought that after setting this path, the compiler/linker knows where to search for those headers, otherwise this INCLUDEPATH doesn't have any sense or am I missing something?

                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by
                #7

                @Binary91 said in Basic question: Including headers with INCLUDEPATH doesn't work:

                Yeah but why do I have to with my own headers?

                Because those are yours and you have to care about them. How should the build system know?
                You don't have to include any Qt cpp files simply because you link your application against already build Qt libraries.
                If you add QT+= gui you tell qmake to link your application against QT GUI libraries.

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                B 1 Reply Last reply
                0
                • jsulmJ jsulm

                  @Binary91 said in Basic question: Including headers with INCLUDEPATH doesn't work:

                  Yeah but why do I have to with my own headers?

                  Because those are yours and you have to care about them. How should the build system know?
                  You don't have to include any Qt cpp files simply because you link your application against already build Qt libraries.
                  If you add QT+= gui you tell qmake to link your application against QT GUI libraries.

                  B Offline
                  B Offline
                  Binary91
                  wrote on last edited by
                  #8

                  @jsulm said in Basic question: Including headers with INCLUDEPATH doesn't work:

                  @Binary91 said in Basic question: Including headers with INCLUDEPATH doesn't work:

                  Yeah but why do I have to with my own headers?

                  Because those are yours and you have to care about them. How should the build system know?
                  You don't have to include any Qt cpp files simply because you link your application against already build Qt libraries.
                  If you add QT+= gui you tell qmake to link your application against QT GUI libraries.

                  Ah that makes sense! So "gui" or "core" are libs that include the source code of the headers that I include? That sounds logically!

                  But I still do not know why my source files should be in the same directory as my headers when I use relative paths, because I set an INCLUDEPATH so compiler/linker should know where to search for it or am I wrong?

                  1 Reply Last reply
                  0
                  • B Binary91

                    @mrjj said in Basic question: Including headers with INCLUDEPATH doesn't work:

                    You should not have to include any standard Qt cpp files. the .H is enough.

                    Yeah but why do I have to with my own headers? Is there a list of pre-defined standard headers and their corresponding sources so compiler/linker knows that automatically? If yes, couldn't that list be extended by own headers/sources?

                    but if you write .pro file BY HAND make sure u include
                    TEMPLATE = app
                    and stuff like
                    QT += core gui
                    Else it wont link Qt to it!!

                    I do not create the whole project file by myself, QtCreator does that so all that stuff is included.

                    Is the file
                    libA.cpp IN THE SAME FOLDER as main.cpp ?

                    Nope, should it? I thought that exactly this could be avoided by setting an INCLUDEPATH, isn't it? I thought that after setting this path, the compiler/linker knows where to search for those headers, otherwise this INCLUDEPATH doesn't have any sense or am I missing something?

                    mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by mrjj
                    #9

                    @Binary91 said in Basic question: Including headers with INCLUDEPATH doesn't work:

                    Nope, should it?

                    Well it dont matter where it is, BUT you say it is in same folder!
                    So it cant find them and hence it dont like your test::test() as it never saw the .cpp file.

                    also INCLUDEPATH is for .H files and NOT .cpp files!

                    SOURCE is for .cpp files and iy MUST be correct path

                    like where where my xml lib is somewhere else
                    SOURCES += main.cpp
                    Configuration.cpp
                    Forms/AbstractForm.cpp \ <<<--------------- in a sub folder called Forms
                    Forms/ConfigurationForm.cpp
                    Forms/DefaultFormFooter.cpp \
                    ../../Common/XML/pugixml-1.5/src/pugixml.cpp \

                    Look at the pugixml.cpp, here i tell it to go back 2 folders and into Common

                    So when you say

                    SOURCES += main.cpp \ CORRECT
                    libA.cpp \ WRONG. AS ITS NOT THERE
                    libB.cpp Also wrong ?

                    B 1 Reply Last reply
                    3
                    • mrjjM mrjj

                      @Binary91 said in Basic question: Including headers with INCLUDEPATH doesn't work:

                      Nope, should it?

                      Well it dont matter where it is, BUT you say it is in same folder!
                      So it cant find them and hence it dont like your test::test() as it never saw the .cpp file.

                      also INCLUDEPATH is for .H files and NOT .cpp files!

                      SOURCE is for .cpp files and iy MUST be correct path

                      like where where my xml lib is somewhere else
                      SOURCES += main.cpp
                      Configuration.cpp
                      Forms/AbstractForm.cpp \ <<<--------------- in a sub folder called Forms
                      Forms/ConfigurationForm.cpp
                      Forms/DefaultFormFooter.cpp \
                      ../../Common/XML/pugixml-1.5/src/pugixml.cpp \

                      Look at the pugixml.cpp, here i tell it to go back 2 folders and into Common

                      So when you say

                      SOURCES += main.cpp \ CORRECT
                      libA.cpp \ WRONG. AS ITS NOT THERE
                      libB.cpp Also wrong ?

                      B Offline
                      B Offline
                      Binary91
                      wrote on last edited by
                      #10

                      @mrjj said in Basic question: Including headers with INCLUDEPATH doesn't work:

                      @Binary91 said in Basic question: Including headers with INCLUDEPATH doesn't work:

                      Nope, should it?

                      Well it dont matter where it is, BUT you say it is in same folder!
                      So it cant find them and hence it dont like your test::test() as it never saw the .cpp file.

                      also INCLUDEPATH is for .H files and NOT .cpp files!

                      SOURCE is for .cpp files and iy MUST be correct path

                      like where where my xml lib is somewhere else
                      SOURCES += main.cpp
                      Configuration.cpp
                      Forms/AbstractForm.cpp
                      Forms/ConfigurationForm.cpp
                      Forms/DefaultFormFooter.cpp \
                      ../../Common/XML/pugixml-1.5/src/pugixml.cpp \

                      Look at the pugixml.cpp, here i tell it to go back 2 folders and into Common

                      So when you say

                      SOURCES += main.cpp \ CORRECT
                      libA.cpp \ WRONG. AS ITS NOT THERE
                      libB.cpp Also wrong ?

                      Yep I know that know and already fixed this. But I don't know why I have to set the full path of the header files after setting INCLUDEPATH?!

                      That is how my project file looks like now:

                      INCLUDEPATH += C:/Qt/lib/headers
                      
                      SOURCES += main.cpp \
                      C:/Qt/lib/sources/libA.cpp \
                      C:/Qt/lib/sources/libB.cpp
                      
                      HEADERS += main.h
                      

                      It still throws these errors...
                      When I include those headers manually like I did with the sources, everything works fine. BUT I thought that I could avoid this with INCLUDEPATH...

                      1 Reply Last reply
                      0
                      • mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by mrjj
                        #11

                        Well normally you do not need to do so...

                        INCLUDEPATH += ../../Common/CONET
                        ../../Common/XML/pugixml-1.5/src/ \

                        the pugixml.h is in the src and i can just use
                        it like
                        #include "pugixml.h"

                        B 1 Reply Last reply
                        0
                        • mrjjM mrjj

                          Well normally you do not need to do so...

                          INCLUDEPATH += ../../Common/CONET
                          ../../Common/XML/pugixml-1.5/src/ \

                          the pugixml.h is in the src and i can just use
                          it like
                          #include "pugixml.h"

                          B Offline
                          B Offline
                          Binary91
                          wrote on last edited by
                          #12

                          @mrjj
                          What could cause that problems then? Do I have to change some build settings in QtCreator?

                          I mean, there is no error in the code, because after manually adding those headers to the project , like:

                          HEADERS += C:/Qt/lib/headers/libA.h
                          

                          works without problems.
                          BUT something like this:

                          HEADERS += libA.h
                          

                          also doesn't work!

                          I don't know what could be wrong. INCLUDEPATH does have an effect to QtCreator, because when I try to include one of my own headers, it searches and autofills the name of the header file. So QtCreator searches for those files in the INCLUDEPATH I set, but it can't combine them when trying to build the project...

                          1 Reply Last reply
                          0
                          • mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by
                            #13

                            No, it works that way. pr default. Nothing I have seen in Creator adjust that.
                            Only thing that can go wrong is path is invalid ( on windows, spaces in path can be issue)

                            HEADERS += libA.h

                            Will work if the libA.h is in the same folder as the .pro file
                            Else its FALSE and will not work.

                            B 1 Reply Last reply
                            0
                            • mrjjM mrjj

                              No, it works that way. pr default. Nothing I have seen in Creator adjust that.
                              Only thing that can go wrong is path is invalid ( on windows, spaces in path can be issue)

                              HEADERS += libA.h

                              Will work if the libA.h is in the same folder as the .pro file
                              Else its FALSE and will not work.

                              B Offline
                              B Offline
                              Binary91
                              wrote on last edited by
                              #14

                              @mrjj
                              I found out that the problem only appears to a few header files!

                              I include 3 headers, each declaring a subclass of a standard Qt class:

                              INCLUDEPATH += C:/Qt/lib/headers
                              
                              HEADERS += main.h
                              
                              SOURCES += main.cpp \
                              myQLineEdit.cpp \
                              myQPushButton.cpp \
                              myQString.cpp
                              

                              The errors appear to the functions defined in the source files myQLineEdit.cpp and myQPushButton.cpp, but NOT in myQString.cpp!

                              I think I got the problem!! In myQLineEdit and myQPushButton class, I do have a Q_OBJECT. Can this cause the problems??

                              1 Reply Last reply
                              0
                              • mrjjM Offline
                                mrjjM Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on last edited by
                                #15

                                Q_OBJECT is used by a tool called moc.exe to help make signals and slot possible
                                It should not to anything with regards to include files. :)
                                As far as I have ever seen.

                                1 Reply Last reply
                                2
                                • B Offline
                                  B Offline
                                  Binary91
                                  wrote on last edited by
                                  #16

                                  that is really annoying..
                                  Why do those undefind reference errors appear to some of my source files but not to all of them?
                                  Don't know where to search for an answer now

                                  1 Reply Last reply
                                  0
                                  • B Offline
                                    B Offline
                                    Binary91
                                    wrote on last edited by
                                    #17

                                    By the way:
                                    the problem really is Q_OBJECT...

                                    I just wrote "Q_OBJECT" into the myQString class and look what happened: undefined reference vtable ... in myQString.cpp!

                                    So Q_OBJECT makes the problems why I have to add all headers to the project! How can I avoid this?

                                    1 Reply Last reply
                                    0
                                    • mrjjM Offline
                                      mrjjM Offline
                                      mrjj
                                      Lifetime Qt Champion
                                      wrote on last edited by mrjj
                                      #18

                                      when u add Q_OBJECT, please run qmake!

                                      1 Reply Last reply
                                      2
                                      • B Offline
                                        B Offline
                                        Binary91
                                        wrote on last edited by
                                        #19

                                        I already tried that.
                                        Building, running
                                        Building, qmake, running
                                        qmake, running
                                        qmake, building, running

                                        None of the above ways succeded

                                        mrjjM 1 Reply Last reply
                                        0
                                        • B Binary91

                                          I already tried that.
                                          Building, running
                                          Building, qmake, running
                                          qmake, running
                                          qmake, building, running

                                          None of the above ways succeded

                                          mrjjM Offline
                                          mrjjM Offline
                                          mrjj
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #20

                                          @Binary91
                                          then please as last test
                                          Complete delete the build folder.

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved