компиляция программы на Фортране из нескольких частей

Я очень-очень новичок в Fortran и во всем компиляторе Intel (я использую компилятор Intel для Windows с библиотекой IMSL без интеграции с Visual Studio, поэтому только командная строка).

Проблема должна быть очень простой: у меня есть программа на Фортране, которую мне нужно было скомпилировать, и которая хранится в виде четырех разных частей исходного кода. Основная программа (и некоторые подпрограммы) хранятся в файле кода с именем central.for, а также есть три файла, назовем их s1.for, s2.for и s3.for, каждый из которых содержит только одну подпрограмму (позволяет назовите их sub1-sub3) и нет основной программы. Основная программа вызывает подпрограммы, хранящиеся в s1-s3, а также в central.for.

Вопрос в том, как мне его скомпилировать:

Когда я пытаюсь скомпилировать файл central.for, он выдает error LNK2019: unresolved external symbol _SUB1 referenced in function _MAIN__. Точно так же он дает одно и то же сообщение для SUB2 и SUB3.

Когда я пытаюсь скомпилировать s1.for-s3.for, выдает error LNK2019: unresolved external symbol _MAIN__ referenced in function _main

Кажется очевидным, что мне нужно как-то связать их. Однако я понятия не имею, как


person johnv    schedule 03.05.2011    source источник


Ответы (2)


Вам нужно сначала скомпилировать части программы без компоновки, а затем связать их все вместе. Таким образом, ваша командная строка будет выглядеть так:

ifort /c s1.for
ifort /c s2.for
ifort /c s3.for
ifort /c central.for

где /c — это сокращение от /compile-only; /nolink тоже подойдет. Это создаст файлы s1.o, s2.o, s3.o и Central.o соответственно. Вышеописанное можно делать в любом порядке. Теперь отдельные части соединяются вместе, и вы сделаете что-то вроде

ifort /exe:central.exe central.o s1.o s2.o s3.o

для сборки исполняемого файла.

Обратите внимание, что это становится на один шаг сложнее, если вы компилируете современный код на Фортране, который использует модули, и (например) основная программа в Central.for имеет строку, подобную use s2. В этом случае вам нужно скомпилировать (даже с /c) s2 перед центральным; при компиляции s2 в этом случае вы получите дополнительный выходной файл s2.mod. Этот файл s2.mod потребуется для компиляции Central.for. Но, учитывая расширения имен файлов, это, вероятно, более старый код, и модули, вероятно, не являются проблемой.

person Jonathan Dursi    schedule 03.05.2011
comment
Большое спасибо! Я думаю, что все 4 части используют библиотеку IMSL. Итак, когда я компилирую каждую часть по отдельности, я должен включить параметр ссылки IMSL, верно? (т. е. ifort /c central.for %link_fnl%) Я выполнил ваши шаги и смог получить файл .exe, но он возвращает ошибку переполнения стека программных исключений, когда я пытаюсь запустить исполняемый файл. Есть ли что-то, что я сделал неправильно, или что-то действительно не так с базовым кодом? Спасибо! - person johnv; 03.05.2011
comment
iДа, вы должны подключиться к библиотеке IMSL. Если ссылка прошла успешно, вы ничего не упускаете. Так что может быть что-то не так с программой, или могут быть проблемы с процессом сборки - 32-битные, а не 64-битные библиотеки и тому подобное. - person Jonathan Dursi; 03.05.2011
comment
Есть ли возможность сделать что-то подобное в Visual Studio? Например, есть проект, который будет только компилировать файлы (создавать .OBJ), а затем другие проекты будут добавлять эти файлы .OBJ в качестве зависимостей и связывать их. - person gajo357; 03.09.2014

Вот как я это сделал. Каждая из вспомогательных функций компилируется в статическую библиотеку. Затем в основной проект программы добавить существующий элемент и выбрать файл статической библиотеки .lib (выход из компиляции). Просто вызывайте функции, как если бы их источник был частью основного кода (с CALL MYLIBFUN())

Удачи.

person John Alexiou    schedule 03.05.2011