Если вы поместите функцию в заголовок, она будет сгенерирована для каждого файла c / cpp, который включает этот заголовок, приводящий к дубликатам. Поможет встроить его.
Редактировать, объяснение
Заголовки защищают как #ifndef, #define ... #endif Конструкция часто вызывается только для предотвращения двойного и рекурсивного включения в один файл cpp. Это актуально в случае, когда исходный файл включает заголовки A и B, а B также включает A. Рекурсивное включение произойдет, если A также включит B.
Ваша проблема возникает из-за того, что у вас есть несколько файлов .cpp. Во время компиляции одного cpp компилятор не знает о существовании других файлов cpp.
Обратите внимание, что #include, #ifdef и friends являются директивами препроцессора. Предварительная обработка происходит в исходных файлах перед компиляцией (хотя это часто рассматривается как часть процесса компиляции). Препроцессор в основном является текстовым процессором. Например, #include текстуально заменяется содержимым заголовочного файла. Содержимое #ifdefs, которое оценивается как false, удаляется из кода. Фактический компилятор получает один большой файл, состоящий из cpp и всех ссылочных включаемых файлов, которые он переводит в объектный файл.