Использование защитных ограждений предотвращает включение заголовка одним блоком компиляции дважды. Например. если заголовок B.h включает в себя A.h, а B.cpp включает в себя A.h и B.h, все из A.h будет объявлено дважды в компиляции B.cpp, если вы не используете include guard.
Ваши включенные охранники предотвращают это, все хорошо до сих пор.
Но вы получаете несколько определений во время компоновки, т.е. два модуля компиляции определяют одно и то же, это, вероятно, означает, что вы получили реальное определение в своем заголовке, используете extern для всех переменных, убедитесь, что функции либо встроены, либо определены в файл cpp.