Ошибка связи при попытке использования объявления модуля в Fortran

Я прочитал этот вопрос: Как вы используете данные модуля Fortran 90 Но я не мог решить свою проблему.

Я получаю ошибку LNK2019: неразрешенный внешний символ, когда я пытаюсь использовать переменную, объявленную в другом модуле.

Для получения дополнительной информации: я начинаю работать в Fortran и работаю над проектом, созданным кем-то другим. Я использую Intel fortran композитор и визуальную студию. Я не знаю точно, правильно ли я понимаю использование данных публичного и частного модулей.

Проблема в том, что всякий раз, когда я пытаюсь использовать переменную BodySystem в другом модуле, она не работает, и я получаю ошибку, что есть неразрешенный внешний символ.

Я неправильно использую публичную и частную части, или я пропускаю что-то еще?

Изменение: я изменил код на компилятивный фрагмент

Edit2: Удалено код, так как это не проблема. IanH дал мне правильный ответ, поскольку объектный файл устарел.

Точное сообщение об ошибке, которое я получаю:

Ошибка 2 фатальной ошибки LNK1120: 1 неразрешенные внешние файлы Debug\HmSlam.exe Ошибка 1 ошибка LNK2019: неразрешенный внешний символ _COORDINATESSYSTEM_M_mp_BODYSYSTEM, указанный в функции _MAIN__ HmSlam.obj

где HmSlam является основной программой, а Coordinatessystem_m - это модуль, в котором объявлена переменная bodysystem.

1 ответ

"Неисправность" отсутствующего символа в сообщении об ошибке компоновщика сообщает вам, что компилятор знает, что имя BODYSYSTEM происходит от модуля COORDINATESSYSTEM_M, иначе он не смог бы скрыть имя модуля и имя символа вместе в пути что у него есть (у компиляторов будут разные соглашения об изменении имени).

Это говорит о том, что проблема, вероятно, не в компиляции вашего кода - что-то не так на этапе связывания.

Я подозреваю, что вы предоставляете устаревшие объектные файлы компоновщику или вообще не предоставляете соответствующий объектный файл.

(Пока мы здесь:

  • Использование процедур, связанных с типом, означает, что это не Fortran 90 - это, по крайней мере, Fortran 2003. Добро пожаловать в 21-й век.

  • У вас нет частной и публичной "части" для вашего источника - у вас есть частные и публичные заявления. Ключевое слово PRIVATE по своему усмотрению в заявлении указывает, что доступность по умолчанию для модуля является частной - то есть по умолчанию вещи, определенные или объявленные в модуле, не будут доступны в тех местах, где модуль является USE 'd. Без такого частного утверждения значение по умолчанию для модуля является общедоступным. Ключевое слово PUBLIC за которым следует список идентификаторов, затем указывает, что эти идентификаторы являются общедоступными (в отличие от установленного по умолчанию личным). Общее позиционирование и количество закрытых и публичных заявлений несущественны, если они появляются в части спецификации модуля после использования и неявных утверждений.

  • Именование идентификатора в спецификаторе ONLY оператора USE не "вызывает" ничего, он просто говорит: "Только этот символ (вместе с любыми другими, указанными в спецификаторе) доступен из этого модуля для использования в следующей области".

licensed under cc by-sa 3.0 with attribution.