Makefile的标准F90库

时间:2009-03-20 19:53:15

标签: c++ makefile fortran

问候每个人,

尝试使用g ++进行编译,并且需要将标准f90(或f77偶数)库链接到我的Makefile中的一些fortran源代码。我无法在任何地方找到它的名字。

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 个答案:

答案 0 :(得分:2)

您使用的是什么版本的GCC? GCC中的fortran编译器已经完全改变了(g77 vs gfortran) - 所以正确的答案非常依赖于确切的版本。 已经有一段时间了,因为我需要这样做(而且我使用旧的g77版本 - 所以事情可能已经改变了)但我记得当时的几个选项是:

  • 尝试使用g77链接并包含库-lstdc ++(可能还有-lm?)
  • 尝试使用g ++链接并包含库-lg2c -lm(可能还​​有-lfrtbegin?)

如果使用更新的gfortran,那么-lgfortran如果链接g ++和-lstdc ++,如果与gfortran链接,则应该有效。

您还需要确保makefile中的g ++和f77命令正在运行您希望它们运行的​​命令(例如,不访问意外目录中的可执行文件或不同/不兼容的版本)。

编辑:从您最近的编辑到您的问题,您似乎试图将SUN编译器的f77与GCC g ++链接起来。我不认为这是可能的。尝试使用GCC的g77或gfortran而不是SUN f77。

答案 1 :(得分:2)

Raugnar,

我推荐您my answer到您之前关于未解决符号的问题。

跑步:

f77 -v something.f

在一个独立的Fortran90程序上,编译器将默认显示哪些支持库已被链接。

答案 2 :(得分:0)

Fortran没有“标准库”。它确实有许多内在函数,但它们是标准定义的语言的一部分。


评论的答案,因为评论字段在字符数方面有点过于严格:

@Michael - 是的,你可以这么说。但是,它仍然与您可能习以为常的其他语言不同。我的意思是这个;编译和构建fortran程序时,编译器或链接器不要求您在进程中包含库。这是编译器的内部事情。这适用于“标准”功能(内在等)。

如果你正在使用一些外部函数或子程序(例如,一些绘图程序),那么你需要单独包含它们。

但是如果您使用的是标准数学函数,这些函数是语言的一部分,那么您的工作就完成了。编写程序,编译并构建它。无需知道这些功能的实现位置或方式,存储实现的位置等。这是编译器的工作。

答案 3 :(得分:0)

最后通过混合各种建议来修复解决方案。

一旦我意识到我使用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 / lib:/ opt / SUNWspro / prod / lib:/ usr / ccs / lib:/ lib:/ usr / lib -lfui -lfai -lfai2 -lfsumai -lfprodai -lfminlai -lfmaxlai -lfminvai -lfmaxvai -lfsu -lsunmath -Bdynamic - lmtsk -lm -lc