Here's an experiment you can try. Instead of the standard include file guard which looks like this:
#ifndef HEADERFILE_H
#define HEADERFILE_H
#endif // HEADERFILE_H
change it to generate an error if it is repeatedly included so you can track down the problem. That would look like this:
#ifndef HEADERFILE_H
#define HEADERFILE_H
#else
#error this file was repeatedly included
#endif
This macro definition will cause an error if you include it repeatedly but you can use the ifdef that is commented and always do it safely. Try this and see if it points out where your problem is.
I do this in all my include files because it can greatly increase compilation speeds on large projects. I also make all header files self-contained, meaning they include everything they need to compile correctly, and this habit helps a lot.
FWIW, I got this idea from Microsoft. They used to do this often in the Win32 SDK headers but not so much any more since pragma once effectively does the same thing. I prefer to get an error so I can track down problems easier.