OK, I have found a workaround for my issue.
As my libraries only need to see the .h file of the top level project "main", there was no need in fact to make these modules REQUIRE or PRIVE_REQUIRE main.
All that was needed was to make sure that the path to common.h was in their include paths.
This does prove that the linking issue was caused by the circular dependency between the parts of the project.
I am not sure what the solution might have been had my library functions needed to actually use functions or variables in the top level main code. In my case this was not needed and I was able to avoid the circular dependency.