Стандартная библиотека F90 для Makefile - PullRequest
2 голосов
/ 20 марта 2009

Привет всем,

Попытка скомпилировать с использованием g ++, и мне нужно связать стандартные библиотеки f90 (или даже f77) для некоторых исходных кодов фортрана в моем Makefile. Я нигде не могу найти его название.

Makerfile:

products: SlowDynamic.exe

SlowDynamic.exe: main.o SA.o mersenne.o CFE.o BCs.o EMatrix.o Numbering.o KMatrix.o Solve.o MA_57.o blas.o MA_57_Depend.o Metis.o
    g++ -L/usr/sfw/lib -R/usr/sfw/lib -lgcc_s -lstdc++ -o SlowDynamic.exe main.o \
        SA.o mersenne.o CFE.o MA_57.o blas.o MA_57_Depend.o Metis.o\
        BCs.o EMatrix.o Numbering.o KMatrix.o Solve.o

main.o: main.cpp
    g++ -c -o main.o main.cpp

SA.o: SA.cpp
    g++ -c -o SA.o SA.cpp

mersenne.o: mersenne.cpp
    g++ -c -o mersenne.o mersenne.cpp

CFE.o: CFE.c
    gcc -c -o CFE.o CFE.c

MA_57.o: MA_57.f
    f77 -c -o MA_57.o MA_57.f

blas.o: blas.f
    f77 -c -o blas.o blas.f

MA_57_Depend.o: MA_57_Depend.f
    f77 -c -o MA_57_Depend.o MA_57_Depend.f

Metis.o: Metis.f
    f77 -c -o Metis.o Metis.f

BCs.o: BCs.c
    gcc -c -o BCs.o BCs.c

EMatrix.o: EMatrix.c
    gcc -c -o EMatrix.o EMatrix.c

Numbering.o: Numbering.c
    gcc -c -o Numbering.o Numbering.c

KMatrix.o: KMatrix.c
    gcc -c -o KMatrix.o KMatrix.c

Solve.o : Solve.c
    gcc -c -o Solve.o Solve.c

clean: 
    rm *.o Main.exe *.gpi

Компилятор:

birch $ make
mksh: Warning: newline is not last character in file Makefile
Current working directory /u/f/osv20/Y4-UNIX/complete
g++ -L/usr/sfw/lib -R/usr/sfw/lib -lgcc_s -o SlowDynamic.exe main.o \
        SA.o mersenne.o CFE.o MA_57.o blas.o MA_57_Depend.o Metis.o\
        BCs.o EMatrix.o Numbering.o KMatrix.o Solve.o
Undefined                       first referenced
 symbol                             in file
__f90_sfw_i4                        MA_57.o
__f90_sfw_ch                        MA_57.o
__f90_sfw_r4                        MA_57.o
__f90_ifw_ch                        MA_57.o
__f90_ifw_r4                        MA_57.o
__nintf                             MA_57.o
__s_cmp                             blas.o
__r_sign                            MA_57_Depend.o
__f90_sifw                          MA_57.o
__f90_ssfw                          MA_57.o
__f90_stop                          blas.o
__f90_esfw                          MA_57.o
__f90_eifw                          MA_57.o
ld: fatal: Symbol referencing errors. No output written to SlowDynamic.exe
collect2: ld returned 1 exit status
*** Error code 1
make: Fatal error: Command failed for target `SlowDynamic.exe'

Результаты для запуска 'f77 -v hello.f'

amos $ f77 -v hello.f
NOTICE: Invoking /usr/bin/f90 -f77 -ftrap=%none -v hello.f
###     command line files and options (expanded):
### -f77=%all -ftrap=%none -v hello.f -lf77compat
### f90: Note: NLSPATH = /opt/SUNWspro/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/SUNWspro/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
/opt/SUNWspro/prod/bin/f90comp -y-o -yhello.o -ev -y-ftrap=%none -m3 -dq -y-fbe -y/opt/SUNWspro/prod/bin/fbe -y-xarch=generic -y-s -H "/opt/SUNWspro/prod/bin/f90 -f77 -ftrap=%none -v " -y-xcache=generic -xcache=generic -I/opt/SUNWspro/prod/include/f95/v8 -p/opt/SUNWspro/prod/lib/modules -y-verbose -xall -xmemalign=8i -y-xmemalign=8i -f77=%all -y-xdbggen=no%stabs+dwarf2 -y-xdbggen=incl -xassume_control=optimize -y-xassume_control=optimize -iorounding=processor-defined -xhasc=yes hello.f
hello.f:
 MAIN hellow:
### f90: Note: LD_LIBRARY_PATH = (null)
### f90: Note: LD_RUN_PATH     = (null)
### f90: Note: LD_OPTIONS = (null)
/usr/ccs/bin/ld -t -R/opt/SUNWspro/lib/sparc:/opt/SUNWspro/lib -o a.out /opt/SUNWspro/prod/lib/crti.o /opt/SUNWspro/prod/lib/crt1.o /opt/SUNWspro/prod/lib/misalign.o /opt/SUNWspro/prod/lib/values-xi.o -Y P,/opt/SUNWspro/lib/sparc:/opt/SUNWspro/prod/lib/sparc:/opt/SUNWspro/lib:/opt/SUNWspro/prod/lib:/usr/ccs/lib:/lib:/usr/lib hello.o -lf77compat -lfui -lfai -lfai2 -lfsumai -lfprodai -lfminlai -lfmaxlai -lfminvai -lfmaxvai -lfsu -lsunmath -Bdynamic -lmtsk -lm -lc /opt/SUNWspro/prod/lib/crtn.o
rm hello.o

Результаты для запуска 'f90 -v hello.f'

amos $ f90 -v hello.f
###     command line files and options (expanded):
### -v hello.f
### f90: Note: NLSPATH = /opt/SUNWspro/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/SUNWspro/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
/opt/SUNWspro/prod/bin/f90comp -y-o -yhello.o -ev -y-ftrap=common -m3 -dq -y-fbe -y/opt/SUNWspro/prod/bin/fbe -y-xarch=generic -y-s -H "/opt/SUNWspro/prod/bin/f90 -v " -y-xcache=generic -xcache=generic -I/opt/SUNWspro/prod/include/f95/v8 -p/opt/SUNWspro/prod/lib/modules -y-verbose -xall -xmemalign=8i -y-xmemalign=8i -y-xdbggen=no%stabs+dwarf2 -y-xdbggen=incl -xassume_control=optimize -y-xassume_control=optimize -iorounding=processor-defined -xhasc=yes hello.f
### f90: Note: LD_LIBRARY_PATH = (null)
### f90: Note: LD_RUN_PATH     = (null)
### f90: Note: LD_OPTIONS = (null)
/usr/ccs/bin/ld -t -R/opt/SUNWspro/lib/sparc:/opt/SUNWspro/lib -o a.out /opt/SUNWspro/prod/lib/crti.o /opt/SUNWspro/prod/lib/crt1.o /opt/SUNWspro/prod/lib/misalign.o /opt/SUNWspro/prod/lib/values-xi.o -Y P,/opt/SUNWspro/lib/sparc:/opt/SUNWspro/prod/lib/sparc:/opt/SUNWspro/lib:/opt/SUNWspro/prod/lib:/usr/ccs/lib:/lib:/usr/lib hello.o -lfui -lfai -lfai2 -lfsumai -lfprodai -lfminlai -lfmaxlai -lfminvai -lfmaxvai -lfsu -lsunmath -Bdynamic -lmtsk -lm -lc /opt/SUNWspro/prod/lib/crtn.o
rm hello.o

Результаты для успешной компиляции с использованием f77:

amos $ make
mksh: Warning: newline is not last character in file Makefile
Current working directory /u/f/osv20/Y4-UNIX/complete
g++ -c -o main.o main.cpp
In file included from main.cpp:16:
SA.h:85:9: warning: no newline at end of file
main.cpp:38:2: warning: no newline at end of file
g++ -c -o SA.o SA.cpp
In file included from SA.cpp:22:
SA.h:85:9: warning: no newline at end of file
In file included from SA.cpp:23:
CFE.h:25:8: warning: no newline at end of file
SA.cpp:468:4: warning: no newline at end of file
g++ -c -o mersenne.o mersenne.cpp
gcc -c -o CFE.o CFE.c
In file included from BCs.h:9,
                 from CFE.c:29:
fg_types.h:38:7: warning: no newline at end of file
In file included from CFE.c:29:
BCs.h:15:84: warning: no newline at end of file
In file included from CFE.c:32:
KMatrix.h:12:171: warning: no newline at end of file
In file included from CFE.c:34:
Solve.h:9:91: warning: no newline at end of file
CFE.c: In function `CFE':
CFE.c:145: warning: `return' with a value, in function returning void
gcc -c -o BCs.o BCs.c
In file included from BCs.h:9,
                 from BCs.c:9:
fg_types.h:38:7: warning: no newline at end of file
In file included from BCs.c:9:
BCs.h:15:84: warning: no newline at end of file
BCs.c:74:2: warning: no newline at end of file
gcc -c -o EMatrix.o EMatrix.c
In file included from EMatrix.h:9,
                 from EMatrix.c:9:
fg_types.h:38:7: warning: no newline at end of file
EMatrix.c:78:2: warning: no newline at end of file
gcc -c -o Numbering.o Numbering.c
In file included from Numbering.h:8,
                 from Numbering.c:8:
fg_types.h:38:7: warning: no newline at end of file
Numbering.c:144:3: warning: no newline at end of file
gcc -c -o KMatrix.o KMatrix.c
In file included from KMatrix.h:8,
                 from KMatrix.c:9:
fg_types.h:38:7: warning: no newline at end of file
In file included from KMatrix.c:9:
KMatrix.h:12:171: warning: no newline at end of file
KMatrix.c:194:2: warning: no newline at end of file
gcc -c -o Solve.o Solve.c
In file included from Solve.c:8:
Solve.h:9:91: warning: no newline at end of file
Solve.c:95:2: warning: no newline at end of file
f77 -c -o MA_57.o MA_57.f
NOTICE: Invoking /usr/bin/f90 -f77 -ftrap=%none -c -o MA_57.o MA_57.f
MA_57.f:
        ma57i:
        ma57a:
        ma57b:
        ma57c:
        ma57q:
        ma57r:
        ma57u:
        ma57s:
        ma57t:
        ma57d:
        ma57e:
        ma57g:
        ma57j:
        ma57k:
        ma57f:
        ma57l:
        ma57m:
        ma57n:
        ma57o:
        ma57p:
        ma57w:
        ma57x:
        ma57y:
        ma57v:
        ma57h:
        ma57z:
f77 -c -o blas.o blas.f
NOTICE: Invoking /usr/bin/f90 -f77 -ftrap=%none -c -o blas.o blas.f
blas.f:
        sgemm:
        stpsv:
        isamax:
        xerbla:
        lsame:
        sgemv:
f77 -c -o MA_57_Depend.o MA_57_Depend.f
NOTICE: Invoking /usr/bin/f90 -f77 -ftrap=%none -c -o MA_57_Depend.o MA_57_Depend.f
MA_57_Depend.f:
        mc47a:
        mc47b:
        mc71a:
        mc34a:
        mc59a:
        mc59b:
        mc59c:
        mc59d:
        mc59e:
        mc59f:
        ma27i:
        ma27a:
        ma27b:
        ma27c:
        ma27g:
        ma27h:
        ma27u:
        ma27j:
        ma27k:
        ma27l:
        ma27m:
        ma27n:
        ma27o:
        ma27p:
        ma27q:
        ma27r:
        mc64i:
        mc64a:
        mc64b:
        mc64d:
        mc64e:
        mc64f:
        mc64r:
        mc64s:
        mc64q:
        mc64u:
        mc64w:
        mc21a:
        mc21b:
        fd15a:
f77 -c -o Metis.o Metis.f
NOTICE: Invoking /usr/bin/f90 -f77 -ftrap=%none -c -o Metis.o Metis.f
Metis.f:
        metis_nodend:
f77 -L/usr/sfw/lib -R/usr/sfw/lib -lgcc_s -lstdc++ -o SlowDynamic.exe main.o \
        SA.o mersenne.o CFE.o MA_57.o blas.o MA_57_Depend.o Metis.o\
        BCs.o EMatrix.o Numbering.o KMatrix.o Solve.o
NOTICE: Invoking /usr/bin/f90 -f77 -ftrap=%none -L/usr/sfw/lib -R/usr/sfw/lib -lgcc_s -lstdc++ -o SlowDynamic.exe main.o SA.o mersenne.o CFE.o MA_57.o blas.o MA_57_Depend.o Metis.o BCs.o EMatrix.o Numbering.o KMatrix.o Solve.o

Ответы [ 4 ]

2 голосов
/ 21 марта 2009

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

  • Попробуйте ссылку с использованием g77 и включите библиотеку -lstdc ++ (и, возможно, -lm?)
  • Попробуйте ссылку с использованием g ++ и включите библиотеки -lg2c -lm (и, возможно, -lfrtbegin?)

Если используется более новый gfortran, то -lgfortran должен работать при связывании с g ++ и -lstdc ++ при соединении с gfortran.

Вы также хотите убедиться, что команды g ++ и f77 в вашем make-файле запускают команды, которые вы ожидаете от них (например, не обращаетесь к исполняемым файлам в неожиданных каталогах или в других / несовместимых версиях).

РЕДАКТИРОВАТЬ: Из ваших последних правок на ваш вопрос вы, кажется, пытаетесь связать компилятор SUN f77 с GCC g ++. Я не думаю, что это возможно. Попробуйте использовать GCC G77 или Gfortran вместо SUN F77.

2 голосов
/ 21 марта 2009

Raugnar,

Я отсылаю вас к моему ответу на предыдущий вопрос о неразрешенных символах.

Просто запустите:

f77 -v something.f

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

0 голосов
/ 22 марта 2009

Наконец-то исправил решение с помощью советов всяких.

Как только я понял, что использую SUN, а не GCC, я переключился на компиляцию с помощью cc (gcc), CC (g ++) и f95 (f77).

Что решило проблему, так это вставка во всю строку компоновщика из подробного отзыва f77 (см. Выше в главном сообщении) и постепенное удаление тех частей, которые не помогли. В конце был добавлен следующий текст:

-t -R / opt / SUNWspro / lib / sparc: / opt / SUNWspro / lib -YP, / opt / SUNWspro / lib / sparc: / opt / SUNWspro / prod / lib / sparc: / opt / SUNWspro / Библиотека: / opt / SUNWspro / prod / lib: / usr / ccs / lib: / lib: / usr / lib lmtsk -lm -lc

0 голосов
/ 20 марта 2009

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


Ответы на комментарии, поскольку поле комментария слишком ограничено в отношении количества символов:

@ Майкл - Да, ты можешь так сказать. Но, тем не менее, это не то же самое, что и с другими языками, к которым вы, вероятно, привыкли. Я имею в виду это; когда вы компилируете и создаете программу на фортране, компилятор или компоновщик не требует, чтобы вы включали библиотеки в процесс. Это внутренняя вещь компилятора. Это касается «стандартных» функций (встроенных и подобных).

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

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

...