Where does Qt find header files?

This seems an old topic. If you ever learned C programming language, you must know the search rules for the header files. The search rules of gcc for headers are simple: for quote form of include directives, gcc looks up first in the same directory as the file that contains the include directive, if not found, gcc looks up in system defined directory. The system default directories are coded into the binary of gcc, which can be seen by running the command “cpp -v”. The result looks like this:

  • ../lib/gcc/x86_64-w64-mingw32/x.x.x/include
  • ../lib/gcc/x86_64-w64-mingw32/x.x.x/include-fixed
  • ../lib/gcc/x86_64-w64-mingw32/x.x.x/../../../../x86_64-w64-mingw32/include

So, these are relative paths. The real paths depend on the installation directory of gcc/cpp.

For angle-bracket form of #include directives, gcc only searches the headers in the default system directories.

However, if you only remember the above two rules, you must be confused about how qt finds the header files in this #include directory:

#include <QCoreApplication>

The file QCoreApplication is apparently not in the above system default search paths. It is a Qt header file instead of a mingw header file. To understand why Qt can find it, you should know the third rule for searching the header files: if you provide -Idir at the gcc command line, the dir is searched before the standard system directories. This is true for both  #include “” and #include <>. But for #include “”, the current directory is searched before the -Idir.

When you build your project in Qt Creator, qmake will add some -Idir in the generated Makefile. For example, you are building the debug version of your project, the -Idir would be:

-I..\myapp -I. -IC:\Qt5.8.1\5.8.1\mingw73_64\include -IC:\Qt5.8.1\5.8.1\mingw73_64\include\QtGui -IC:\Qt5.82.1\5.8.1\mingw73_64\include\QtANGLE -IC:\Qt5.8.1\5.8.1\mingw73_64\include\QtCore -Idebug -IC:\VulkanSDK\1.0.21.0\include -IC:\Qt5.8.1\5.8.1\mingw73_64\mkspecs\win32-g++

in which ..\myapp is your project directory, . is the building directory, debug is the directory under the building directory that is used to store the building outcomes(the .o and the .exe files). C:\Qt5.8.1\5.8.1\mingw73_64\include\QtCore, etc. are in the Qt installation directory. The file QCoreApplication is right in C:\Qt5.8.1\5.8.1\mingw73_64\include\QtCore so the compiler can find it without problem.

With more and more modules are added to .pro file, qmake will add more -Idirs. For example, if you add “QT += widgets” in .pro file, you will get one extra -Idir:”-IC:\Qt5.8.1\5.8.1\mingw73_64\include\QtWidgets”.

Note the search order: the current directory, -I dir, standard system directories. If gcc finds the header in one of the directories, it stops searching further, which means you can provide a header file to over-ride another header with the same name in the latter directories.

 

Did you like this?
Tip admin with Cryptocurrency

Donate Bitcoin to admin

Scan to Donate Bitcoin to admin
Scan the QR code or copy the address below into your wallet to send some bitcoin:

Donate Bitcoin Cash to admin

Scan to Donate Bitcoin Cash to admin
Scan the QR code or copy the address below into your wallet to send bitcoin:

Donate Ethereum to admin

Scan to Donate Ethereum to admin
Scan the QR code or copy the address below into your wallet to send some Ether:

Donate Litecoin to admin

Scan to Donate Litecoin to admin
Scan the QR code or copy the address below into your wallet to send some Litecoin:

Donate Monero to admin

Scan to Donate Monero to admin
Scan the QR code or copy the address below into your wallet to send some Monero:

Donate ZCash to admin

Scan to Donate ZCash to admin
Scan the QR code or copy the address below into your wallet to send some ZCash:
Posted in

Leave a Reply