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

Я не программист на Фортране (просто небольшой опыт), но мне нужно скомпилировать программу, частично написанную на 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 ]

2 голосов
/ 29 июля 2010

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

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

1 голос
/ 15 августа 2010

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

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

1 голос
/ 30 июля 2010

Если вы хотите скомпилировать и связать, используя g77, самый простой способ - использовать команду "g77". (Какой компилятор запускает f77 на вашем компьютере? Попробуйте «f77 -v» или аналогичный, чтобы выяснить ...) Он должен автоматически найти библиотеки g77 для Fortran. Вам не нужно явно ссылаться на библиотеки 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.

1 голос
/ 29 июля 2010

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

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

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

0 голосов
/ 30 июля 2010

Кажется, что проблема была в ошибке в одном из исходных файлов, что не имело большого значения для компилятора 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 вел себя очень странно и на самом деле не делал то, что хотел.

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

...