Das lässt sich nur mit sauberer Programmierung umgehen.
Die /extern/-Deklaration gehört in eine *.h-Datei, und diese muss in
beide *.c-Dateien eingebunden werden.
Dann nämlich kann der Compiler beim Übersetzen der *.c-Datei, in der die
Variable tatsächlich definiert wird, herausfinden, daß da ein
Widerspruch besteht.
Beim von Dir beschriebenen Verfahren aber ist der Compiler beim
Übersetzen beider *.c-Dateien glücklich, und der Linker bekommt nur
einen Symbolnamen ohne Typinformationen vorgesetzt, so daß er das
Problem nicht erkennen kann.
Anders sähe es aus, würde man die beien *.c-Dateien mit einem
C++-Compiler übersetzen, dann nämlich erzeugt der Compiler "dekorierte
Namen" für die Symbole, und beim Linken kracht es dann, weil die Namen
sich unterscheiden.