F77: проблема при компиляции с g77 программы, которая обычно компилировалась с помощью компилятора Absoft

Я не программист на Фортране (просто небольшой опыт), но мне нужно скомпилировать программу, частично написанную на F77, Кто-то скомпилировал Absoft компилятор до меня, но теперь мне нужно повторить процедуру на другой машине с g77, Для Absoft, make-файл имеет

f77 -f  -w -O -B100 -B108 -c *.f
mv *.f flib && mv *.o olib
f77  -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH  -lfpvm3 -lpvm3 -L$ABSOFT/lib -lU77

Я изменил эти строки, чтобы

g77   -w -O -B100 -B108 -c *.f
mv *.f flib && mv *.o olib
g77  -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH  -lfpvm3 -lpvm3  -lgfortran -lgfortranbegin

Но я получаю следующие сообщения об ошибках

somefile.f:(.text+0x93): undefined reference to `for_open'
somefile.f:(.text+0xf4): undefined reference to `for_write_seq_fmt'
somefile.f:(.text+0x128): undefined reference to `for_write_seq_fmt_xmit'
somefile.f:(.text+0x454): undefined reference to `for_read_seq'

Как я могу это исправить?


Update1

Если я добавлю -libifcore до конца последней строки (компоновщик), тогда я получаю

/usr/bin/ld: cannot find -libifcore

Я нашел библиотеку

$ find /opt/intel/* -name 'libifcore*'
/opt/intel/fce/9.1.036/lib/libifcore.a
/opt/intel/fce/9.1.036/lib/libifcore.so
/opt/intel/fce/9.1.036/lib/libifcore.so.5
/opt/intel/fce/9.1.036/lib/libifcore_pic.a
/opt/intel/fce/9.1.036/lib/libifcoremt.a
/opt/intel/fce/9.1.036/lib/libifcoremt.so
/opt/intel/fce/9.1.036/lib/libifcoremt.so.5
/opt/intel/fce/9.1.036/lib/libifcoremt_pic.a

Но даже если я делаю следующее в исходном каталоге

$ export PATH=$PATH:/opt/intel/fce/9.1.036/lib/
$ ln -s /opt/intel/fce/9.1.036/lib/libifcore.so

это не найдено.

Более того, это та же машина, где у меня возникает другая проблема. Как передать -libm в MPICC? libimf.so: предупреждение: feupdateenv не реализован и всегда будет терпеть неудачу

Похоже, что компилятор должен найти библиотеку, если это необходимо

$ echo $LD_LIBRARY_PATH
/opt/intel/fce/9.1.036/lib:/opt/intel/cce/9.1.042/lib:/usr/local/lib/openmpi:/usr/local/lib:/usr/lib:

5 ответов

Решение

Кажется, проблема была в ошибке в одном из исходных файлов, что не имело большого значения для компилятора Absoft. g77 предупреждал об этом, но компилировал этот файл и выдавал оригинальные ошибки (упомянутые в вопросе) без двоичного файла.

Когда я пытался ifort, компиляция этого файла была прервана, но другие файлы были скомпилированы, и был создан двоичный файл.

fortcom: Error: somefile.f, line 703: An extra comma appears in the format list.   [)]
     & (1p5e12.3,5h  ...,))                                             
-------------------------^
compilation aborted for somefile.f (code 1)

Когда я удалил лишнюю запятую, то оба компилятора скомпилировали все и создали двоичные файлы, хотя ifort произвел ряд предупреждений.

Затем, когда я попытался запустить оба бинарных файла, тот, который был сделан компилятором Intel, работал нормально, но один g77 вел себя очень странно и на самом деле не делал то, что я хотел.

Итак, теперь исходная проблема решена, однако код не работает в многопроцессорном режиме, поэтому двоичный файл, к сожалению, для меня бесполезен.

Absoft принял расширенную версию Fortran 77, которая не полностью совместима с расширенной версией Fortran 77, принятой g77.

Таким образом, нет никаких гарантий, что вы можете сделать это без редактирования кода. Кажется, я вспоминаю, что компилятор Absoft принял удобный синтаксис инициализации, который не может быть воспроизведен с помощью g77.

Почему вы используете g77, а не gfortran? что вы имеете в виду под многопроцессорностью? OpenMP или векторизация?

вы можете использовать openmp с компилятором gfortran, и когда вы хотите использовать векторный режим, как это делает компилятор ifort, вы должны явно указать sse в опциях компилятора.

Если вы хотите скомпилировать и связать, используя g77, самый простой способ - использовать команду "g77". (Какой компилятор запускает f77 на вашем компьютере? Попробуйте "f77 -v" или аналогичный, чтобы узнать...) Он должен автоматически найти специфичные для g77 Fortran библиотеки. Вам не нужно явно указывать ссылки на библиотеки Фортрана, особенно на библиотеки gfortran, который является другим компилятором. Вы также можете скомпилировать и связать с gfortran - он, вероятно, распознает, что исходный код является Fortran 77, и скомпилирует соответствующим образом, если файлы имеют правильный тип файла, в противном случае вам придется использовать опции - для этого компилятора используйте команду " gfortran".

С g77 и gfortran не нужны библиотеки Intel - может быть, f77 подключен к ifort, компилятору Intel, на вашем компьютере?

Отредактировано позже:

Я предлагаю сначала попробовать что-нибудь попроще, чтобы проверить свои настройки.

Попробуйте эту программу на FORTRAN 77 как файл "junk.f"

C234567
      write (6, *) "Hello World"
      stop
      end

Попробуйте эту команду:

g77 junk.f -o junk.exe

Запустите его через:

./junk.exe

Это проверит, работает ли g77.

Похоже, вы пытаетесь связать с libifcore,

Редактировать: Вы можете включить эту библиотеку, добавив '-lifcore' в опции вашего компилятора. Цитировать учебник GCC

В общем, опция компилятора -lNAME пытается связать объектные файлы с библиотечным файлом 'libNAME.a' в стандартных каталогах библиотеки.

Другие вопросы по тегам