Hey life maybe its a design problem. Circular dependency, was at first such a pain to debug, didnt know what it was and why I had this problem.
Pretty much you have made two structures or classes or a combo of those that rely on eachother but then you get this header loop as if one of the files cannot include the header it relies on as its already been defined in the other file... right?
My trick is to not design it that way. I vaguely remember a teacher of mine coming up with a solution though is was a very stretched solution and I put that into the basket of things i shouldn't do on a regular basis... thus I try not to make two classes that depend on each other.
I would just put the struct triangle and vertex in the file vertexObject as that is what needs it. The graphicsSystem file doesn't use it, It uses a vertexObject which is made up of triangle - which in turn is made up of vertex. To sum up you have them in the wrong file to begin with :p
sorry if thats not the answer you wanted but I would avoid this type of problem as I can't see the benefit, but I would rethink that idea if someone can convince me of why it would be a good idea... hhhmmm
One type of structure could be visualised as a tree branch. As it grows new branches are made at a node and they split off into other directions and this process continues, but never does any of the new branches grow back into previously made branches. So as you make new classes you want to link to those adjacent classes but never make a recursive link - link back to one that has already been linked. Basically structures are not loops, they are containers that hold and separate information. Discrete processes in functions should be generating loops for simulation purposes that use that data being held in structures.
Depending on how the data is structured into containers one can create rules and ordering of how that information can be accessed and found. If you can create a structure that holds information in such a way that is can be accessed quickly - without much work having been done. A well designed structure can automate data access intuitively.
If you have a bowl and you want to make fruit salad you might want to include an apple and an orange into your bowl to make the combination of the two and now you have access to both fruits in the one bowl. But it would be unreasonable to make an apple tree grow oranges but then how can you make the orange tree now grow apples if %50 of the time you might get either an apple or an orange as an apple tree has already been converted into an orange tree and is no longer an apple tree it is an appleOrange tree and now you cant make an orangeApple tree and you no longer have an apple tree.
LOL, if that make you confused then you now understand circular dependency and why I avoid it.