Проблема именно в том, что говорится в сообщении об ошибке.Abc.h объявляет переменную, но она не определяет ее.Строка в a.cpp определяет это.То есть a.cpp - это место, где появляется физическое хранилище переменной.В b.cpp такой строки нет, поэтому, когда вы попытаетесь скомпилировать эту программу, компоновщик останется без хранилища, определенного для этой переменной.
Если вы опустите в заголовке спецификатор "extern", тогдаb.cpp скомпилировался бы нормально, но a.cpp, вероятно, вывел бы ошибку о нескольких определениях.
Спецификатор "extern" играет большую роль, когда у вас есть несколько исходных файлов в одной программе.В этом случае, вероятно, все они будут включать abc.h, но без «extern» каждый скомпилированный объектный файл будет иметь свое собственное независимое определение той же переменной.Обычно компоновщик не знает, что с этим делать, и, вероятно, будет жаловаться, хотя я не думаю, что это необходимо.Исправление заключается в использовании «extern», поэтому каждый файл скомпилированного файла имеет только объявление .Затем вы выбираете один исходный файл для размещения определения. Вы, вероятно, поместите его в abc.cpp, поскольку объявление находится в abc.h.