Да, правило нарушено. Скажем, если оба. cpp встроены в одну и ту же библиотеку stati c и используется одна из них, это приведет к UB. Это связано с тем, что компоновщик не может определить разницу между этими двумя ссылками и случайным образом. То же самое происходит, когда вы связываете несколько библиотек stati c, которые определяют один и тот же символ. Линкер просто предполагает, что это одно и то же.
Фактически, часто компоновщику приходится выбрасывать дубликаты из-за определений функций / классов в заголовках.
IIR C разделяемые библиотеки / .dll более устойчивость к этой проблеме, так как компоновщику доступно только гораздо более ограниченное количество символов.
В C ++ 20 модули должны устранять такие проблемы.