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.@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?
-
@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?
@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 ? -
@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 ?@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... -
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" -
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"@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...
-
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. -
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.@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??
-
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. -
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?
-
when u add Q_OBJECT, please run qmake!
-
I already tried that.
Building, running
Building, qmake, running
qmake, running
qmake, building, runningNone of the above ways succeded
-
tried that, two.
Deleted everything but my project file and the sources/headers. Didn't work :-(
Is it possible that qmake ignores INCLUDEPATH?
-
Well, I'll post the whole project file, its headers and sources and maybe you can copy/paste it and try to run it with?
If it works, then it is a setting problem. If not, something with my include logic doesn't work.
project file:
#------------------------------------------------- # # Project created by QtCreator 2016-11-17T15:45:17 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = CourseCalculator TEMPLATE = app INCLUDEPATH += C:/Qt/lib/headers HEADERS += main.h SOURCES += main.cpp C:/Qt/lib/sources/myQString.cpp \ C:/Qt/lib/sources/myQLineEdit.cpp \ C:/Qt/lib/sources/myQPushButton.cpp
main.cpp:
// main.cpp #include "main.h" int main(int argc, char *argv[]) { QApplication applicationApp(argc, argv); clsWindowMain windowMain; QTimer::singleShot(0, &windowMain, SLOT(slotStart())); int ret = applicationApp.exec(); return ret; } main.h:
// main.h
#ifndef MAIN_H #define MAIN_H #include <QApplication> #include <QTimer> #include <QWidget> #include <QDialog> #endif // MAIN_H
myQLineEdit.h:
// myQLineEdit.h #ifndef MYQLINEEDIT_H #define MYQLINEEDIT_H #include <QDebug> #include <QLineEdit> #include <QMessageBox> #include <QDir> // forward declaration class myQLineEdit; // declaration class myQLineEdit : public QLineEdit { Q_OBJECT // .. properties public: myQLineEdit(QWidget* widgetParent = 0); ~myQLineEdit(); // .. more methods }; #endif
myQLineEdit.cpp:
// myQLineEdit.cpp #include <myQLineEdit.h> // absolute path or absolute path with whitespaces also doesn't work // ----- constructors ----- myQLineEdit::myQLineEdit(QWidget* widgetParent) : QLineEdit(widgetParent) { // stuff }
Is that compilable for you?
-
Well, I'll post the whole project file, its headers and sources and maybe you can copy/paste it and try to run it with?
If it works, then it is a setting problem. If not, something with my include logic doesn't work.
project file:
#------------------------------------------------- # # Project created by QtCreator 2016-11-17T15:45:17 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = CourseCalculator TEMPLATE = app INCLUDEPATH += C:/Qt/lib/headers HEADERS += main.h SOURCES += main.cpp C:/Qt/lib/sources/myQString.cpp \ C:/Qt/lib/sources/myQLineEdit.cpp \ C:/Qt/lib/sources/myQPushButton.cpp
main.cpp:
// main.cpp #include "main.h" int main(int argc, char *argv[]) { QApplication applicationApp(argc, argv); clsWindowMain windowMain; QTimer::singleShot(0, &windowMain, SLOT(slotStart())); int ret = applicationApp.exec(); return ret; } main.h:
// main.h
#ifndef MAIN_H #define MAIN_H #include <QApplication> #include <QTimer> #include <QWidget> #include <QDialog> #endif // MAIN_H
myQLineEdit.h:
// myQLineEdit.h #ifndef MYQLINEEDIT_H #define MYQLINEEDIT_H #include <QDebug> #include <QLineEdit> #include <QMessageBox> #include <QDir> // forward declaration class myQLineEdit; // declaration class myQLineEdit : public QLineEdit { Q_OBJECT // .. properties public: myQLineEdit(QWidget* widgetParent = 0); ~myQLineEdit(); // .. more methods }; #endif
myQLineEdit.cpp:
// myQLineEdit.cpp #include <myQLineEdit.h> // absolute path or absolute path with whitespaces also doesn't work // ----- constructors ----- myQLineEdit::myQLineEdit(QWidget* widgetParent) : QLineEdit(widgetParent) { // stuff }
Is that compilable for you?
-
Good idea. But my dropbox accout has no free memory left :-D
Have to create a new account first, maybe on g drive...
-
Good idea. But my dropbox accout has no free memory left :-D
Have to create a new account first, maybe on g drive...