Защита заголовков. Ваши определения функций и определений типов не должны объявляться дважды. Поэтому не забывайте про защиту включения: старый способ #ifndef #define #endif или прагмой #pragma once. Но думаю Вы итак это используете, а проблема именно в переменных.
Если вы объявляете переменную в заголовочном файле (не надо так) т.е. вне функции - переменная является статической и область видимости такой переменной - файл, но вы хотите через .h файл сделать видимой статическую переменную с областью видимости файл в разных файлах. Переменные не объявляются в .h файлах.
Решение: статические переменные объявляются в .с файле. Если вы хотите ограничить область видимости до файла, используете static. А вот если вы хотите расширить область видимости до проекта, то в файле, где вы хотите использовать объявленную в другом месте переменную, используйте ключевое слово extern. Иными словами - объявили в .с файле статическую переменную (int x;) создали .h файл и там указали extern int x; и теперь вы можете добавлять свой .h файл и переменная x будет обладать внешней компоновкой, и из всех .с файлах вы будете обращаться к одной статической переменной х (которая объявлена и инициализирована один раз в .с файле, но никак в .h)