компиляция программы на Фортране из нескольких частей - PullRequest
5 голосов
/ 03 мая 2011

Я очень новичок в 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

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

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

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

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.Но, учитывая расширения имени файла, скорее всего, это старый код, и модули, вероятно, не являются проблемой.

0 голосов
/ 03 мая 2011

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

Удачи.

...