Проблема на самом деле (частично, по крайней мере) в коде C ++. Вы не сказали, что isareal
и MMS
являются внешними, поэтому для них компилятор сгенерирует «экземплярный» символ (кавычки, потому что я не помню правильный термин). Вы можете видеть это, например, с помощью "readelf -s main.o"
0000000000000000 4 OBJECT GLOBAL DEFAULT 4 MMS
Здесь важно отметить, что столбец Ndx
(следующий за последним столбцом, рядом с именем символа) говоритчто MMS
находится в разделе # 4.
Если вы исправите код C ++, добавив extern
к объявлениям isareal
и MMS
, вы увидите, что номера разделов изменятся на UND
Это означает, что это ссылка на символ в каком-то другом объектном файле, которая должна быть разрешена компоновщиком.
Вторая часть головоломки состоит в том, что если вы компилируете код Fortran с помощью -finit-local-zero
, компилятор Fortranтакже будет генерировать "экземпляры" символов. И затем, когда вы пытаетесь связать их вместе, вы получаете ошибку «множественное определение». Теперь, если вы опустите опцию -finit-local-zero
, GFortran поместит эти два символа в секцию COM
(сокращение от COMDAT
), которая является секцией особого вида, где допускается несколько определений. Я не уверен, почему это сделано, хотя я бы предположил, что COMDAT
не позволяет символам, которые инициализируются до некоторого значения.
Если вы будете искать в GCC bugzilla, вы найдете кучуПроблемы Фортрана, связанные с проблемой множественных определений, все связаны в лабиринте извилистых отрывков.