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' в стандартных каталогах библиотеки.