Ваш пример кода должен прекрасно работать как в Linux, так и в Windows. Между GCC и MSVC не должно быть никаких различий в отношении видимости глобальных переменных. Я думаю, что более вероятно, что то, что вы видите, является симптомом другой проблемы.
Единственное, что я могу придумать, чтобы не допустить подобной проблемы, это "испортить" заголовочные файлы, если использовать для этого технический термин. Распространенной проблемой при переносе кода из Windows в Linux является чувствительность к регистру файлов заголовков. Принимая во внимание, что MSVC не будет заботиться, импортируете ли вы MyHeader.h как #include <myheader.h>
, это определенно потерпит неудачу в Linux. Если ваш заголовок не включен, компилятор пропустит объявление extern и может привести к ошибке, которую вы видите.